B - Sum of divisors HDU - 4432
2017-07-25 19:19
288 查看
题目链接:点击打开链接
题意大概是给你一个数 n 和 m,找出在0~n中能被 n 整除的数,然后讲这些数字转化成 m 进制,转成后将 m 进制数字上的每个数字平方后相加,得到 一个和 sum ,最后再将 sum转化成 m 进制,sum 转化的 m 进制数字即为输出结果;例如:
n = 10,m =2;
找出 0~n 以内的约数为 1,2,5,10; 将这些数字转化成2进制为1,10,101,1010;之后各二进制上的数字平方相加 sum = 1^2+1^2+0^2+1^2+0^2+1^2+1^2+0^2+1^2+0^2=1+1+0+1+0+1+1+0+1+0=6,即sum = 6;最后将sum 转化成2进制即为输出结果,输出结果为110;
注意:找0~n以内能被n整除的数的时候,应该用到sqrt(n)用 n 除以0~sqrt(n)以内能被n整除的数,可以得出sqrt(n)~n以内能被 n 整除的数,如果用 n 而不用sqrt(n)的话,最后会超时(这我深有体会
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/fastcry.gif)
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/fastcry.gif)
,你懂的);
#include <cstdio> #include <iostream> #include <string> #include <cstring> #include <algorithm> #include <iomanip> #include <cmath> using namespace std; typedef long long ll; int change(int n,int base) { int sum=0; while(n){ sum+=(n%base)*(n%base); n=n/base; } return sum; } int main() { int n,base; while(cin>>n>>base){ char a[100]; int sum=0; for(int i=1;i<=sqrt(n);i++){ if(n%i==0){ sum+=change(i,base); if(n/i!=i){ sum+=change(n/i,base); } } } int cnt=0; while(sum){ int t=sum%base; if(t<10) a[cnt++]=t+48; else if(t>=10) a[cnt++]='A'+t-10; sum=sum/base; } for(int i=cnt-1;i>=0;i--) cout<<a[i]; cout<<endl; } return 0; }
相关文章推荐
- HDU 4432 Sum of divisors (进制模拟)
- HDU 4432 Sum of divisors
- HDU 4432 Sum of divisors (水题,进制转换)
- hdu 4432 Sum of divisors
- HDU-4432-Sum of divisors ( 2012 Asia Tianjin Regional Contest )
- HDU 4432 Sum of divisors 质因数分解
- HDU 4432 Sum of divisors (进制模拟)
- HDU 4432 Sum of divisors 2012 Asia Tianjin Regional Contest
- HDU-4432-Sum of divisors ( 2012 Asia Tianjin Regional Contest )
- HDU 4432 Sum of divisors (进制模拟)
- HDU 4432 Sum of divisors
- HDU 4432 Sum of divisors (进制转换模板)
- HDU—— 4432 Sum of divisors
- hdu 4432 Sum of divisors(十进制转其他进制)
- hdoj 4432 Sum of divisors
- HDU:4432 Sum of divisors
- hdu 4432 Sum of divisors
- hdu 4432 Sum of divisors(模拟)
- HUD 4432 Sum of divisors 天津现场赛B题
- hdu 4432 Sum of divisors