poj1845 sumdiv (因数的和)
Posted ressed
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1845 sumdiv (因数的和)相关的知识,希望对你有一定的参考价值。
首先分解质因数,$A^B=p_1^{m_1B}p_2^{m_2B}...p_n^{m_nB}$
然后的话,它的所有因数的和就是$prod{(1+p_i^1+p_i^2+...+p_i^n)}$
用一个等比数列求和公式,变成了$prod{frac{p_i^{m_iB+1}-1}{p_i-1}}$
但是要求逆元的话,它的模数很小,可能求不了
所以在算$p_i^{n+1}-1$的时候先模的是$mod*(p_i-1)$,然后直接除以$p_i-1$,一定能整除
最后再模一边mod就行了
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define pa pair<int,int> 5 #define CLR(a,x) memset(a,x,sizeof(a)) 6 using namespace std; 7 typedef long long ll; 8 const int maxn=1e4,P=9901; 9 10 inline ll rd(){ 11 ll x=0;char c=getchar();int neg=1; 12 while(c<‘0‘||c>‘9‘){if(c==‘-‘) neg=-1;c=getchar();} 13 while(c>=‘0‘&&c<=‘9‘) x=x*10+c-‘0‘,c=getchar(); 14 return x*neg; 15 } 16 17 ll p[maxn]; 18 ll n[maxn],a,b; 19 20 inline ll fmul(ll x,ll y,ll p){ 21 ll re=0; 22 while(y){ 23 if(y&1) re=(re+x)%p; 24 x=(x+x)%p,y>>=1; 25 }return re; 26 } 27 28 inline ll fpow(ll x,ll m,ll p){ 29 ll re=1; 30 while(m){ 31 if(m&1) re=fmul(re,x,p); 32 x=fmul(x,x,p),m>>=1; 33 }return re; 34 } 35 36 int main(){ 37 int i,j=0,k; 38 a=rd(),b=rd(); 39 for(i=2;i*i<=a;i++){ 40 if(a%i==0) p[++j]=i; 41 while(a%i==0) n[j]++,a/=i; 42 }if(a!=1) p[++j]=a,n[j]=1; 43 ll ans=1; 44 for(i=1;i<=j;i++){ 45 ll x=fpow(p[i],n[i]*b+1,(p[i]-1)*P)+(p[i]-1)*P-1; 46 ans=ans*(x/(p[i]-1)%P)%P; 47 } 48 printf("%d ",(ans+P)%P); 49 return 0; 50 }
以上是关于poj1845 sumdiv (因数的和)的主要内容,如果未能解决你的问题,请参考以下文章
POJ 1845Sumdiv——数论 质因数 + 分治 + 快速幂