POJ 1845 Sumdiv
2011-02-25 20:46
225 查看
将a进行质因数分解,则a^b=(p1^k1)*(p2^k2)*...*(pn^kn)
根据公式,所有因子之和为
(1+p1+p1^2+...p1^k1)*(1+p2+p2^2+...p2^k2)*...*(1+pn+pn^2+...+pn^kn)
计算1+p+p^2+...p^n可以利用二分进行加速
当n为奇数时,例如n=5
则1+p+p^2+p^3+p^4+p^5=(1+p+p^2)+p^3*(1+p+p^2)=(1+p+p^2)*(1+p^3)
可以发现1+p+p^2+...p^n=(1+p+p^2+...+p^(k/2))*(1+p^(k/2+1))
当n为偶数时,例如n=4
则1+p+p^2+p^3+p^4=(1+p)+p^3*(1+p)+p^2=(1+p)*(1+p^3)+p^2
可以发现1+p+p^2+...p^n=(1+p+p^2+...+p^(k/2-1))*(1+p^(k/2+1))+p^(k/2)
代码:
根据公式,所有因子之和为
(1+p1+p1^2+...p1^k1)*(1+p2+p2^2+...p2^k2)*...*(1+pn+pn^2+...+pn^kn)
计算1+p+p^2+...p^n可以利用二分进行加速
当n为奇数时,例如n=5
则1+p+p^2+p^3+p^4+p^5=(1+p+p^2)+p^3*(1+p+p^2)=(1+p+p^2)*(1+p^3)
可以发现1+p+p^2+...p^n=(1+p+p^2+...+p^(k/2))*(1+p^(k/2+1))
当n为偶数时,例如n=4
则1+p+p^2+p^3+p^4=(1+p)+p^3*(1+p)+p^2=(1+p)*(1+p^3)+p^2
可以发现1+p+p^2+...p^n=(1+p+p^2+...+p^(k/2-1))*(1+p^(k/2+1))+p^(k/2)
代码:
#include<iostream> #include<memory.h> #include<cstdio> using namespace std; const int MAXN=7100; #define M 9901 int e[MAXN],factor[MAXN]; int cnt; __int64 a,b; __int64 pow(__int64 p,__int64 n)//计算p^n { __int64 ret=1,s=p; while(n) { if(n&1) ret=(ret*s)%M; s=(s*s)%M; n>>=1; } return ret; } __int64 get(__int64 p,__int64 k)//计算1+p+p^2+...+p^k { if(k==0) return 1; if(k&1) return ((1+pow(p,k/2+1))%M*get(p,k/2)%M)%M; else return ((1+pow(p,k/2+1))%M*get(p,k/2-1)%M+pow(p,k/2)%M)%M; } int main() { int i,j,x; __int64 ans; memset(e,0,sizeof(e)); x=0; scanf("%I64d%I64d",&a,&b); for(i=2;i*i<=a;i++) { if(a%i==0) { factor[x]=i; while(a%i==0) { a/=i; e[x]++; } x++; } } if(a>1) { factor[x]=a; e[x++]=1; } ans=1; for(i=0;i<x;i++)//x个因子 { __int64 tmp=get(factor[i],e[i]*b); //cout<<factor[i]<<" "<<e[i]<<endl; ans=(ans*tmp)%M; //cout<<ans<<endl; } cout<<ans<<endl; return 0; }
相关文章推荐
- POJ 1845Sumdiv(数论)
- POJ 1845 Sumdiv (逆元 等比数列求和)
- poj 1845 Sumdiv——数论
- POJ 1845 Sumdiv
- POJ 1845(Sumdiv) 数论好题
- poj 1845 Sumdiv
- poj 1845 Sumdiv ,质因子分解
- POJ 1845 Sumdiv
- POJ1845 Sumdiv【快速模幂+素因子分解+等比数列+二分法】
- POJ 1845 Sumdiv (快速分解因式+快速幂取模)
- poj-1845-Sumdiv-数论-快速幂取模+快速分解因式
- poj 1845 POJ 1845 Sumdiv 数学模板
- POJ 1845 Sumdiv
- POJ 1845-Sumdiv(数论,A^B的所有约数和)
- POJ 1845 Sumdiv
- POJ-1845 Sumdiv 逆元,特殊情况
- POJ 1845 Sumdiv(逆元、分治)【真心好题啊=_=】
- poj1845-Sumdiv
- [POJ1845]Sumdiv
- poj1845——Sumdiv(数论+幂的因子和)