本质是求:
P是一个质数对吧
费马小定理一下
发现P-1不是质数(废话)
所以还是要求一个大组合数
所以我们需要exLucas定理
用CRT merge一下
最后快速幂
所以是个练手的好题
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef int INT;
#define int long long
const int Mod=999911659;
int mod[4]={2,3,4679,35617};
int fac[35620]={};
inline void Pre(int mod){
fac[0]=1;
for(int i=1;i<=mod;i++){
fac[i]=fac[i-1]*i%mod;
}
}
inline int quick_pow(int x,int k,int mod){
int ret=1;
while(k){
if(k%2==1)ret=(x*ret)%mod;
k/=2;
x=x*x%mod;
}
return ret;
}
inline int C(int n,int m,int mod){
if(m>n)return 0;
return fac[n]*quick_pow(fac[n-m],mod-2,mod)%mod*quick_pow(fac[m],mod-2,mod)%mod;
}
inline int Lucas_Theorem(int n,int m,int mod){
if(!m)return 1;
return C(n%mod,m%mod,mod)*Lucas_Theorem(n/mod,m/mod,mod);
}
inline int Unique_Decomposition_Theorem(int sum,int mod){
int ret=0;
for(int i=1;i*i<=sum;i++){
if(sum%i==0){
ret=(ret+Lucas_Theorem(sum,i,mod))%mod;
if((sum/i)!=i){
ret=(ret+Lucas_Theorem(sum,(sum/i),mod))%mod;
}
}
}
// cout<<sum<<" "<<ret<<" "<<mod<<'\n';
return ret;
}
inline int Chinese_Remainder_Theorem(int sum){
int ret=0;
for(int i=0;i<=3;i++){
Pre(mod[i]);
int inv=quick_pow((Mod-1)/mod[i],mod[i]-2,mod[i]);
int now=Unique_Decomposition_Theorem(sum,mod[i]);
ret=(ret+inv*((Mod-1)/mod[i])%(Mod-1)*now)%(Mod-1);
}
return ret;
}
int n,g;
int Solve(){
cin>>n;
cin>>g;
if(g==Mod)return 0;
int pow=Chinese_Remainder_Theorem(n);
return quick_pow(g,pow,Mod);
}
INT main(){
// freopen("test.in","r",stdin);
cout<<Solve();
return 0;
}