好难啊
如果p为质数
自然随便做
但是不是质数需要扩展Lucas定理
说白了就是对唯一分解的质数单独讨论
再用中国剩余定理合并
#include<bits/stdc++.h>
using namespace std;
typedef int INT;
#define int long long
inline void read(int &x){
x=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
f=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
x*=f;
}
int mod;
int n,m;
int w[6]={};
int sum=0;
int ans=1;
int Pow(int a,int k,int p){
int ret=1;
while(k){
if(k%2==1){
ret=ret*a%p;
}
k/=2;
a=a*a%p;
}
return ret;
}
//void exgcd(int a,int b,int &d,int &x,int &y){
// if(b==0)d=a,x=1,y=0;
// else exgcd(b,a%b,d,y,x),y-=(a/b)%x;
//}
void exgcd(int a,int b,int &d,int &x,int &y){
if(b==0) d=a,x=1,y=0;
else exgcd(b,a%b,d,y,x),y-=(a/b)*x;
}
int Inv(int a,int n){
int d,x,y;
exgcd(a,n,d,x,y);
return (d==1)?(x+n)%n:-1;
}
int Fac(int n,int p,int pr){
if(n==0)return 1;
int ret=1;
for(int i=2;i<=pr;i++)if(i%p)ret=ret*i%pr;
ret=Pow(ret,n/pr,pr);
int r=n%pr;
for(int i=2;i<=r;i++)if(i%p)ret=ret*i%pr;
return ret*Fac(n/p,p,pr)%pr;
}
int C(int n,int m,int p,int pr){
if(n<m)return 0;
int x=Fac(n,p,pr);
int y=Fac(m,p,pr);
int z=Fac(n-m,p,pr);
int cnt=0;
for(int i=n;i;i/=p)cnt+=i/p;
for(int j=m;j;j/=p)cnt-=j/p;
for(int i=n-m;i;i/=p)cnt-=i/p;
int ret=x*Inv(y,pr)%pr*Inv(z,pr)%pr*Pow(p,cnt,pr)%pr;
return ret*(mod/pr)%mod*Inv(mod/pr,pr)%mod;
}
int Lucas(int n,int m){
int x=mod;
int ret=0;
for(int i=2;i<=x;i++){
if(x%i==0){
int pr=1;
while(x%i==0)pr*=i,x/=i;
ret=(ret+C(n,m,i,pr)%mod)%mod;
}
}
return ret;
}
INT main(){
read(mod);
read(n);
read(m);
for(int i=1;i<=m;i++){
read(w[i]);
sum+=w[i];
}
if(n<sum){
puts("Impossible");
return 0;
}
for(int i=1;i<=m;i++){
ans=ans*Lucas(n,w[i])%mod;
n-=w[i];
// cout<<ans<<'\n';
}
cout<<ans;
}