HDU 4432 Sum of divisors 2012 Asia Tianjin Regional Contest
解题报告:
题目大意:输入两个数n和m,要求按一下步骤做,首先将n转化成m进制的数,然后求这个数的每一位的平方和。最后转化成m进制再显示出来。
模拟题,要注意的一点是这个m的范围是2到16,所以当m超过10时要记得转化为对应的字母表示。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cmath> 3 typedef __int64 ll; 4 ll n,m; 5 char an[17]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 6 ll add(ll N,ll M) { 7 ll sum=0; 8 while(N) { 9 ll d=N%M; 10 sum+=d*d; 11 N/=M; 12 } 13 return sum; 14 } 15 void print(ll N,ll M) { 16 char a[10005]; 17 int i=1; 18 while(N) { 19 a[i++]=an[N%M]; 20 N/=M; 21 } 22 for(int j=i-1;j>=1;--j) 23 printf("%c",a[j]); 24 printf("\n"); 25 } 26 27 int main( ) { 28 while(scanf("%I64d%I64d",&n,&m)!=EOF) { 29 ll sum=0; 30 for(ll i=1;i<=sqrt(n);++i) 31 if(n%i==0) { 32 sum+=add(i,m); 33 if(i*i!=n) 34 sum+=add(n/i,m); 35 } 36 print(sum,m); 37 } 38 return 0; 39 }