题目链接:传送门
题意:
求2004^x的全部约数的和。
分析:
由唯一分解定理可知
x=p1^a1*p2^a2*...*pn^an
那么其约数和 sum = (p1^0+p1^1^…+p1^a1)*…* (pn^0+pn^1^…+pn )
代码例如以下:
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; const int mod = 29; int quick_mod(int a,int b){ int ans = 1; while(b){ if(b&1) ans=ans*a%mod; b>>=1; a=a*a%mod; } return ans; } int fac[10],cnt; int num[10]; void init(){ int n = 2004; cnt = 0; memset(num,0,sizeof(num)); for(int i=2;i*i<=n;i++){ if(n%i==0){ fac[cnt]=i; while(n%i==0) n/=i,num[cnt]++; cnt++; } } if(n>1) fac[cnt]=n,num[cnt++]=1; } int main() { int n; while(~scanf("%d",&n)&&n){ init(); int ans = 1; for(int i=0;i<cnt;i++){ num[i]*=n; int inv = quick_mod(fac[i]-1,mod-2); ans=ans*((quick_mod(fac[i],num[i]+1)-1+mod)*inv%mod)%mod; } printf("%d\n",ans); } return 0; }