答案是:
G(∑k|NCNkN)%(mod−1)%mod
然后上面的东西lucas然后CRT合并就行了。
一开始写了个礼物,然后TLE
#include <bits/stdc++.h>
using namespace std;
#define mod 999911659
#define N 41000
#define ll long long
int p[5]={2,3,4679,35617,};
int a[5],jc[5][N],njc[5][N];
int n,G;
int qpow(int x,int y,int md)
{
int ret=1;
while(y)
{
if(y&1)ret=(ll)ret*x%md;
x=(ll)x*x%md;y>>=1;
}
return ret;
}
void init()
{
for(int i=0;i<4;i++)
{
jc[i][0]=njc[i][0]=1;
for(int j=1;j<p[i];j++)
jc[i][j]=(ll)jc[i][j-1]*j%p[i];
njc[i][p[i]-1]=qpow(jc[i][p[i]-1],p[i]-2,p[i]);
for(int j=p[i]-2;j>=1;j--)
njc[i][j]=(ll)njc[i][j+1]*(j+1)%p[i];
}
}
void exgcd(ll &x,ll &y,int a,int b)
{
if(b==0){x=1;y=0;return;}
exgcd(y,x,b,a%b);y-=a/b*x;
}
int C1(int x,int y,int md,int tp)
{
if(y>x)return 0;
return (ll)jc[tp][x]*njc[tp][y]%md*njc[tp][x-y]%md;
}
int C(int x,int y,int md,int tp)
{
int ret=1;
while(x)
{
ret=(ll)ret*C1(x%md,y%md,md,tp)%md;
x/=md;y/=md;
}
return ret;
}
void getc(int x)
{
for(int i=0;i<4;i++)
a[i]=(a[i]+C(n,x,p[i],i))%p[i];
}
int CRT(int md)
{
int ret=0;
ll x,y;
for(int i=0;i<4;i++)
{
exgcd(x,y,md/p[i],p[i]);
x=(x%p[i]+p[i])%p[i];
ret=(ret+md/p[i]*x%md*a[i]%md)%md;
}
return ret;
}
int main()
{
//freopen("tt.in","r",stdin);
init();
scanf("%d%d",&n,&G);
if(G==mod)return puts("0"),0;
for(int i=1;i*i<=n;i++)
if(n%i==0)
{
getc(i);
if(i*i!=n)getc(n/i);
}
int t=CRT(mod-1);
printf("%d\n",qpow(G,t,mod));
return 0;
}