实验吧 大数模运算
实验吧 大数模运算
题目链接:http://www.shiyanbar.com/ctf/1906
题目大意:求$12345^{12345}$的所有约数之和,并对其取模$9901$再输出。
唯一分解定理+生成函数
对于任意一个数$a$,由唯一分解定理得$a=\prod_{i=0}^k p_i^{c_i}$,
故由生成函数的定义可知,其约数之和为$S=\prod_{i=0}^k (\sum_{j=0}^{c_i} p_i^j)$.
而对于$a^n$,则有$a=\prod_{i=0}^k p_i^{n \times c_i}$.
故其约数之和为$S'=\prod_{i=0}^k (\sum_{j=0}^{n \times c_i} p_i^j)$.
由等比数列求和公式即可求得答案.
代码如下:
1 #include <cstdio> 2 #define N 10005 3 using namespace std; 4 typedef long long ll; 5 ll a=12345,n=12345,m=9901,p[N],c[N],k,ans=1; 6 ll minus(ll a,ll b){return (a-b+m)%m;} 7 ll mul(ll a,ll b){return (a*b)%m;} 8 ll powmod(ll a,ll n){ 9 ll r=1; 10 while(n){ 11 if(n&1)r=mul(r,a); 12 a=mul(a,a); 13 n>>=1; 14 }return r; 15 } 16 int main(void){ 17 for(int i=2;i*i<=a;++i)if(a%i==0){ 18 while(a%i==0){ 19 c[k]+=n; 20 a/=i; 21 }p[k++]=i; 22 } 23 if(m!=1){ 24 c[k]+=n; 25 p[k++]=a; 26 } 27 for(int i=0;i<k;++i) 28 ans=mul(ans,mul(minus(powmod(p[i],c[i]+1),1),powmod(p[i]-1,m-2))); 29 printf("%lld\n",ans); 30 }