对于
有
所以我们只需要求出a的所有素因子 然后将幂次乘b 搞几个二分幂累乘即可
但是注意 如果用等比公式的话需要求逆元 会爆longlong
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define ll long long #define M 9901 ll prime[10010]; int book[10010]; int cnt; void init() { int i,j; for(i=2;i<=10000;i++) { if(!book[i]) { prime[++cnt]=i; for(j=i+i;j<=10000;j+=i) { book[j]=1; } } } return; } ll getpow(ll a,ll b) { ll ans; ans=1; while(b>0) { if(b%2==1) { ans=(ans*a)%M; } a=(a*a)%M; b/=2; } return ans; } ll getsum(ll p,ll n) { if(n==0) { return 1; } if(n%2==1) { return (getsum(p,n/2)*(1+getpow(p,n/2+1)))%M; } else { return ((getsum(p,n/2-1)*(1+getpow(p,n/2+1)))+getpow(p,n/2))%M; } } int main() { ll a,b,p,ans; int i; init(); scanf("%lld%lld",&a,&b); ans=1; for(i=1;prime[i]*prime[i]<=a;i++) { if(a%prime[i]==0) { p=0; while(a%prime[i]==0) { p++; a/=prime[i]; } ans=(ans*getsum(prime[i],b*p))%M; } } if(a!=1) { ans=(ans*getsum(a,b))%M; } printf("%lld\n",ans); return 0; }