1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| #include<algorithm> #include<iostream> #include<iomanip> #include<cstring> #include<cstdlib> #include<vector> #include<cstdio> #include<cmath> #include<queue> using namespace std; typedef long long LL; inline const LL Get_Int() { LL num=0,bj=1; char x=getchar(); while(x<'0'||x>'9') { if(x=='-')bj=-1; x=getchar(); } while(x>='0'&&x<='9') { num=num*10+x-'0'; x=getchar(); } return num*bj; } const LL mod[]= {0,2,13,5281,7283},Mod=999999599; LL n,g,f[10005][5],invf[10005][5]; LL C(LL n,LL m,int id) { if(m>n)return 0; return f[n][id]*invf[m][id]%mod[id]*invf[n-m][id]%mod[id]; } LL Lucas(LL n,LL m,int id) { if(!m)return 1; return (C(n%mod[id],m%mod[id],id)*Lucas(n/mod[id],m/mod[id],id))%mod[id]; } LL Quick_Pow(LL a,LL b,LL mod=Mod) { LL ans=1; while(b) { if(b&1)ans=ans*a%mod; a=a*a%mod; b>>=1; } return ans; } LL inv(LL a,LL mod) { return Quick_Pow(a,mod-2,mod); } LL Crt(const LL* a) { LL ans=0; for(int i=1; i<=4; i++) { LL M=(Mod-1)/mod[i]; ans=(ans+M*inv(M,mod[i])*a[i])%(Mod-1); } return ans; } LL Solve(LL d) { LL a[5]; for(int i=1; i<=4; i++)a[i]=Lucas(n,n/d,i); LL ans=Crt(a); return ans; } int main() { for(int i=1; i<=4; i++) { f[0][i]=invf[0][i]=1; for(int j=1; j<=8000; j++) { f[j][i]=f[j-1][i]*j%mod[i]; invf[j][i]=inv(f[j][i],mod[i]); } } while(~scanf("%lld%lld",&n,&g)) { if(g%Mod==0) { puts("0"); continue; } LL sum=0; for(LL d=1; d<=sqrt(n); d++) if(n%d==0) { sum=(sum+Solve(d))%(Mod-1); if(d!=n/d)sum=(sum+Solve(n/d))%(Mod-1); } LL ans=Quick_Pow(g,sum); printf("%lld\n",ans); } return 0; }
|