求 A^B 的全部約數之和 mod 9901。html
首先,咱們要求出A的約數之和。ios
就是把A分解質因數,成爲:a1^k1*a2^k2*a3^k2....git
而後約數和就是(a1^0+a1^1+a1^2+....)*(a2^0+a2^1+....)*.......ide
那麼A的B次方就是每一位都乘以一個Bui
而後對於每個ai,都是一個等比數列求和。spa
而後求和公式須要用到除法,須要逆元。code
#include <iostream> #include <cstdio> #include <algorithm> #include <cstdlib> #include <cstring> #include <queue> #define in(a) a=read() #define MAXN 100010 #define REP(i,k,n) for(long long i=k;i<=n;i++) using namespace std; inline long long read(){ long long x=0,f=1; char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1; for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; return x*f; } long long pr[100010],ti[10010]; long long ind=0; long long mod=9901; inline void divide(long long n){ for(long long i=2;i*i<=n;i++) if(n%i==0){ pr[++ind]=i; while(n%i==0){ n=n/i; ti[ind]++; } } if(n>1){ pr[++ind]=n; ti[ind]=1; } return ; } inline long long qpow(long long a,long long b){ long long ans=1; while(b){ if(b%2) ans=(ans*a)%mod; b/=2; a=(a*a)%mod; } return ans; } int main(){ long long a,b; long long ans=1; in(a),in(b); divide(a); REP(i,1,ind){ if(pr[i]-1%mod==0) ans=ans*(ti[i]*b)%mod; long long den,dor; den=qpow(pr[i],b*ti[i]+1)-1; dor=qpow(pr[i]-1,mod-2); ans=(ans*(den*dor)%mod)%mod; } cout<<ans; return 0; }