首先要知道 因子和的公式
(1+p1+p1^2+`````+p1^a1)*(1+p2+p2^2+````+p2^a2)*```````````````````````````````````
道理很简单 组合上的小知识 让后就是求等比数列mod mo的事了 可以用乘法逆元求
不过这里有个trick 就是可能分解下的质数-1跟9901不互质 这里特别判断一下就可以
至于求逆元可以用快速幂(费马定理) 还有扩展欧几里得
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<vector> #include<sstream> #include<string> #include<climits> #include<stack> #include<set> #include<bitset> #include<cmath> #include<deque> #include<map> #include<queue> #define iinf 0x7f7f7f7f #define linf 1000000000000000000LL #define dinf 1e200 #define eps 1e-11 #define all(v) (v).begin(),(v).end() #define sz(x) x.size() #define pb push_back #define mp make_pair #define lng long long #define sqr(a) ((a)*(a)) #define pii pair<int,int> #define pll pair<lng,lng> #define pss pair<string,string> #define pdd pair<double,double> #define X first #define Y second #define pi 3.14159265359 #define ff(i,xi,n) for(int i=xi;i<=(int)(n);++i) #define ffd(i,xi,n) for(int i=xi;i>=(int)(n);--i) #define ffl(i,r) for(int i=head[r];i!=-1;i=edge[i].next) #define ffe(i,r) for(_edge *i=head[r];i;i=i->next) #define cc(i,j) memset(i,j,sizeof(i)) #define two(x) ((lng)1<<(x)) #define lson l , mid , rt << 1 #define rson mid + 1 , r , rt << 1 | 1 #define mod 9901 #define pmod(x,y) (x%y+y)%y using namespace std; typedef vector<int> vi; typedef vector<string> vs; template<class T> inline void checkmax(T &x,T y) { if(x<y) x=y; } template<class T> inline void checkmin(T &x,T y) { if(x>y) x=y; } template<class T> inline T Min(T x,T y) { return (x>y?y:x); } template<class T> inline T Max(T x,T y) { return (x<y?y:x); } template<class T> T Abs(T a) { return a>0?a:(-a); } template<class T> inline T lowbit(T n) { return (n^(n-1))&n; } template<class T> inline int countbit(T n) { return (n==0)?0:(1+countbit(n&(n-1))); } lng Pow(lng x,lng y) { lng res=1; if(x==-1) return 0; while(y) { if(y&1) res=(res*x)%mod; x=sqr(x)%mod; y/=2; } return res; } void f(lng a,lng b,lng &x,lng &y) { if(b==0) { x=1,y=0; return ; } f(b,a%b,x,y); lng t; t=x; x=y; y=t-a/b*y; } lng a,b; lng A,B; lng p[2000],num[2000]; int main() { while(scanf("%I64d%I64d",&A,&B)==2) { lng res=1; int y=0; if(A==0) { printf("0\n"); continue; } for(lng i=2;i*i<=A;++i) { if(A%i==0) { p[++y]=i; num[y]=0; while(A%i==0) A/=i,num[y]++; } } if(A>1) p[++y]=A,num[y]=1; for(lng i=1;i<=y;++i) { a=p[i],b=B*num[i]; if((a-1)%mod==0) { res=res*(b+1)%mod; continue; } lng t,o; f(a-1,mod,t,o); t=pmod(t,mod); res=(res*(Pow(a,b+1)-1))%mod*t%mod; // res=(res*(Pow(a,b+1)-1))%mod*(Pow(a-1,mod-2))%mod; pow way } if(res<0) res+=mod; printf("%I64d\n",res); } return 0; }