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;
}