求助exLucas
查看原帖
求助exLucas
160839
Prean楼主2020/12/21 22:15

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));
}
2020/12/21 22:15
加载中...