比赛时做读完这个题,感觉一般的模拟过不了,就放过去了,结果发现就是个模拟题,按照题目意思做就可以了,另外要注意n要开方,否则会超时。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,m,digit[100];
int ans;
void comp(int a)
{
int aa=a;
memset(digit,0,sizeof(digit));
int i=0;
while(a)
{
digit[i]=a%m;
ans+=digit[i]*digit[i];
a/=m;
i++;
}
int u=n/aa;
if(u!=aa)
{
a=u;
i=0;
memset(digit,0,sizeof(digit));
while(a)
{
digit[i]=a%m;
ans+=digit[i]*digit[i];
a/=m;
i++;
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
int i;
while(scanf("%d%d",&n,&m)!=EOF)
{
ans=0;
for( i=1; i*i<=n; i++)
{
if(n%i==0)
comp(i);
}
memset(digit,0,sizeof(digit));
i=0;
while(ans)
{
digit[i++]=ans%m;
ans/=m;
}
for(i--; i>=0; i--)
{
if(digit[i]>=10)
printf("%c",digit[i]-10+'A');
else cout<<digit[i];
}
cout<<endl;
}
return 0;
}