求N的因子之和。
理论依据:
代码:
1 /* 2 显然,数据够大的时候,数组要用 __int64 3 4 */ 5 6 #include<iostream> 7 #include<map> 8 #include<cstdio> 9 #include<cstdlib> 10 #include<cstring> 11 12 using namespace std; 13 14 15 bool s[1000003]; 16 int num[1000003];//用来%j 17 int ans[1000003];//保存和。 18 19 void make_ini() //全部扫一遍。筛选一下。 20 { 21 int i,j,k,t; 22 for(i=1;i<=1000000;i++) 23 { 24 num[i]=i; 25 ans[i]=1; 26 } 27 for(i=2;i<=1000000;i++) 28 if(s[i]==false)//是素数 29 { 30 for(j=i;j<=1000000;j=j+i)//枚举每个素数的倍数 31 { 32 // if(j%i==0) //这个肯定成立,不需要 33 { 34 k=1;t=1; 35 while(num[j]%i==0) 36 { 37 num[j]=num[j]/i; 38 t=t*i;//关键部分。 39 k=k+t;//关键部分 40 } 41 ans[j]=ans[j]*k; 42 } 43 s[j]=true; 44 } 45 } 46 } 47 48 int main() 49 { 50 int n; 51 make_ini(); 52 while(scanf("%d",&n)>0) 53 { 54 printf("%d\n",ans[n]-n); 55 } 56 return 0; 57 }