exLucas95分求调
查看原帖
exLucas95分求调
448884
快乐的大童楼主2022/7/20 09:20

RT,WA on 14,怀疑自己exLucas板子正确性

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int M=10,N=1e6+5;
int MOD,n,m,w[M],s[M],ans=1;
namespace exLucas {
	int a[N],b[N];
	void exgcd(int x,int y,int &sum1,int &sum2) {
		if(!y) {
			sum1=1,sum2=0;
			return;
		}
		exgcd(y,x%y,sum1,sum2);
		int X=sum1;
		sum1=sum2;
		sum2=X-x/y*sum2;
	}
	int inv(int x,int mod) {
		int res=0,y=0;
		exgcd(x,mod,res,y);
		return (res%mod+mod)%mod;
	}
	int crt(int n) {
		int res=0;
		for(int i=1; i<=n; i++) {
			int mi=MOD/a[i],pi=inv(mi,a[i]);
			res=(res+(b[i]*(mi*pi)%MOD)%MOD)%MOD;
		}
		return res;
	}
	int ksm(int x,int y,int mod) {
		int res=1;
		while(y) {
			if(y&1) res=(res*x)%mod;
			x=(x*x)%mod;
			y>>=1;
		}
		return res;
	}
	int fac(int n,int mod,int a) {
		if(!n) return 1;
		int xhj=1,yushu=1;
		for(int i=1; i<=a; i++)
			if(i%mod!=0)
				xhj=(xhj*i)%mod;
		xhj=ksm(xhj,n/a,a);
		for(int i=a*(n/a); i<=n; i++)
			if(i%mod!=0)
				yushu=(yushu*(i%a))%a;
		return ((fac(n/mod,mod,a)*xhj)%a*yushu)%a;
	}
	int sfac(int n,int p) {
		return n>=p?sfac(n/p,p)+(n/p):0;
	}
	int C(int n,int m,int p,int mod) {
		int a1=fac(n,p,mod),a2=inv(fac(m,p,mod),mod),a3=inv(fac(n-m,p,mod),mod),a4=ksm(p,sfac(n,p)-sfac(m,p)-sfac(n-m,p),mod);
		return (((a1*a2)%mod*a3)%mod*a4)%mod;
	}
	int exlucas(int n,int m) {
		int lsbl=MOD,cnt=0;
		for(int i=2; i*i<=MOD; i++) {
			if(lsbl%i==0) {
				int num=1;
				while(lsbl%i==0) {
					num*=i;
					lsbl/=i;
				}
				a[++cnt]=num;
				b[cnt]=C(n,m,i,num);
			}
		}
		if(lsbl!=1) {
			a[++cnt]=lsbl;
			b[cnt]=C(n,m,lsbl,lsbl);
		}
		return crt(cnt)%MOD;
	}
}
using namespace exLucas;
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>MOD>>n>>m;
	for(int i=1; i<=m; i++) cin>>w[i];
	for(int i=1; i<=m; i++) s[i]=s[i-1]+w[i];
	if(s[m]>n){
		cout<<"Impossible";
		return 0;
	}
	for(int i=1;i<=m;i++) ans=(ans*exlucas(n-s[i-1],w[i]))%MOD;
	cout<<ans%MOD;
}
2022/7/20 09:20
加载中...