a的b次方

题目大意:给定a和b,求a的b次方的约束和(对9901取模)

如果不知道约数和公式恐怕这题有一定难度……

根据唯一分解定理,我们有a=p1^a1+p2^a2+……pn^an;

那么约数和s=Σ(pi^0+pi^1+pi^2^……pi^ai);

不难想到这个。

那么如何快速(这是重点)求(pi^0+pi^1+pi^2^……pi^ai)?

我们可以分治(也许是二分),然后注意加上快速幂。

AC代码如下:

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int MOD=9901; const int N=10;//前十个素数之积已经超过int! int a,b,x=2,p[N],hs[N],tot; long long ans=1; int pw(int aa,int bb) { int res=1;aa%=MOD; while(bb>0) { if(bb&1) res=res*aa%MOD; aa=aa*aa%MOD; bb>>=1; } return res; } int ksm(int num,int nd) { int res=0; if(nd==1) return (num+1)%MOD; if(nd==0) return 1; if(nd%2) { res=ksm(num,nd/2); res%=MOD; res=res*(pw(num,nd/2+1)+1)%MOD; } else { res=ksm(num,nd/2-1); res%=MOD; res=res*(pw(num,nd/2+1)+1)%MOD; res+=pw(num,nd/2)%MOD; } return res%MOD; } int main() { scanf("%d%d",&a,&b); while(x*x<=a) { if(a%x==0){ p[++tot]=x;while(a%x==0) a/=x,hs[tot]++; } x++; } if(a>1) p[++tot]=a,hs[tot]++; for(int i=1;i<=tot;i++) ans=(ans*ksm(p[i],hs[i]%(MOD-1)*b%(MOD-1)))%MOD; printf("%lld",ans); return 0; }

猜你喜欢

转载自www.cnblogs.com/Alex-leaves/p/9301628.html