1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| #include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=1e5+10; ll w[maxn],S[maxn]; ll qpow(ll a,ll b,ll p) { ll t=1; while(b!=0) { if(b&1)t=(t*a)%p; a=a*a%p;b>>=1; } return t%p; } ll stac(ll n,ll p) { ll sum=0; for(ll i=p;i<=n;i*=p)sum+=n/i; return sum; } void exgcd(ll a,ll b,ll &x,ll &y) { if(b==0){x=1,y=0;return;} exgcd(b,a%b,x,y); ll z=x;x=y;y=z-a/b*y; } ll inv(ll v,ll p) { ll x,y; exgcd(v,p,x,y); return(x+p)%p; } ll fact(ll n,ll p,ll k) { if(n==0)return 1; ll res=1; for(ll i=1;i<=k;i++) if(i%p)res=res*i%k; res=qpow(res,n/k,k); for(ll i=1;i<=n%k;i++) if(i%p)res=res*i%k; return res*fact(n/p,p,k)%k; } ll C(ll n,ll m,ll p,ll k) { if(n<m)return 0; return fact(n,p,k)%k*inv(fact(m,p,k),k)%k*inv(fact(n-m,p,k),k)%k*qpow(p,stac(n,p)-stac(m,p)-stac(n-m,p),k)%k; } ll exlucas(ll n,ll m,ll mod) { int k=0; ll x=mod,b[maxn],a[maxn]; for(ll i=2;x!=1;i++) { if(x%i==0) { ll tmp=1; while(x%i==0) { tmp*=i; x/=i; } b[++k]=tmp; a[k]=C(n,m,i,tmp); } } ll ans=0; for(int i=1;i<=k;i++) { ll Mi=mod/b[i]; ans=(ans+Mi*inv(Mi,b[i])*a[i])%mod; } return ans; } int main() { ll n,m,mod; scanf("%lld",&mod); scanf("%lld%lld",&n,&m); for(int i=1;i<=m;i++) { scanf("%lld",&w[i]); S[i]=S[i-1]+w[i]; } if(S[m]>n) { printf("Impossible\n"); return 0; } ll ans=1; for(int i=1;i<=m;i++) ans=(ans*exlucas(n-S[i-1],w[i],mod))%mod; printf("%lld",ans); return 0; }
|