RT,样例2挂掉了,在F函数总是输出0,有无dalao能帮忙DEBUG啊/kel
#include<cstdio>
typedef long long ll;
ll n,m;int p;
inline int Add(const int&a,const int&b,const int&mod){
return a+b>=mod?a+b-mod:a+b;
}
inline int Del(const int&a,const int&b,const int&mod){
return a-b<0?a-b+mod:a-b;
}
void exgcd(const int&a,const int&b,int&x,int&y){
if(!b)return void(x=(y=0)+1);
exgcd(b,a%b,y,x);y-=a/b*x;
}
inline int inv(const int&a,const int&mod){
static int x,y;
exgcd(a,mod,x,y);
return x<0?x+mod:x;
}
inline int pow(int a,int b,int mod){
int ans=1;
for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*ans*a%mod;
return ans;
}
inline int Solve(const ll&n,const int&p,const int&pk){
if(n==1||n==0)return 1;
int ans=1;
for(ll i=pk*(n/pk);i<=n;++i){
if(i%p)ans=1ll*ans*(i%pk)%pk;
}
return 1ll*Solve(n/pk,p,pk)*ans%pk;
}
inline int F(const ll&n,const int&p,const int&pk){
int i,ans=1,index=0;
for(int i=1;i<=pk;++i){
if(i%p)ans=1ll*ans*i%pk;
}
for(ll P=pk;P<=n;P*=pk)index=Add(index,n/P%(pk-1),pk-1);
return 1ll*Solve(n,p,pk)*pow(ans,index,pk)%pk;
}
inline int G(const ll&n,const int&p,const int&pk){
return n<p?0:Add(G(n/p,p,pk),n/p,pk);
}
inline int C(const ll&n,const ll&m,const int&p,const ll&pk){
int tmp=pow(p,Del(Del(G(n,p,pk-1),G(m,p,pk-1),pk-1),G(n-m,p,pk-1),pk-1),pk);
return 1ll*F(n,p,pk)*inv(F(m,p,pk),pk)%pk*inv(F(n-m,p,pk),pk)%pk*tmp%pk;
}
inline int exLucas(const ll&n,const ll&m,const int&mod){
static int a[10],b[10];
int i,M,P=mod,pk,top=0,ans=0;
for(i=2;i*i<=P;++i){
if(!(P%i)){
pk=1;
while(!(P%i))pk*=i,P/=i;
++top;a[top]=C(n,m,i,pk);b[top]=pk;
}
}
if(P!=1)++top,a[top]=C(n,m,P,P),b[top]=P;
for(i=1;i<=top;++i){
M=mod/b[i];
ans=Add(ans,1ll*a[i]*inv(M,b[i])%mod*M%mod,mod);
}
return ans;
}
signed main(){
scanf("%lld%lld%d",&n,&m,&p);
printf("%d",exLucas(n,m,p));
}