题目梗概
求 G∑d|n(nd)%P
解题思路
由欧拉定理可得原式 =G∑d|n(nd)%ϕ(P)%P
(nd) 由Lucas定理可得,然后 ϕ(P)=999911658=2∗3∗4679∗35617 可以用中国剩余定理解出次数
#include<cstdio>
#define LL long long
using namespace std;
const int maxn=100005;
const int P=999911659,M=P-1;
LL ji[maxn];
int m[5],n,G,ans;
int qsm(int w,int b,int tt){
LL num=1;
while(b){
if (b%2==1) num=(LL)num*w%tt;
w=(LL)w*w%tt;
b>>=1;
}
return num;
}
LL c(int x,int y,int tt){if (x>y) return 0;return (LL)ji[y]*qsm((LL)ji[x]*ji[y-x]%tt,tt-2,tt)%tt;}
LL Q(int x,int y,int tt){int num=1;while(y) num=(LL)num*c(x%tt,y%tt,tt)%tt,x/=tt,y/=tt; return num;}
int main(){
freopen("exam.in","r",stdin);
freopen("exam.out","w",stdout);
scanf("%d%d",&n,&G);
if (G%P==0) return printf("0\n"),0;
m[1]=2;m[2]=3;m[3]=4679;m[4]=35617;
for (int i=1;i<=4;i++){
ji[0]=1;for (int j=1;j<=m[i];j++) ji[j]=(LL)ji[j-1]*j%m[i];
int num=0;
for (int j=1;j*j<=n;j++)if (n%j==0){
num=(num+Q(j,n,m[i]))%m[i];
if (j*j<n) num=(num+Q(n/j,n,m[i]))%m[i];
}
ans=(ans+(LL)num*(M/m[i])%M*qsm(M/m[i],m[i]-2,m[i])%M)%M;
}
printf("%d\n",qsm(G,ans,P));
return 0;
}