Description
Input
Output
若不存在可行方案,则输出
Impossible,否则输出一个整数,表示模 P 后的方案数。
Sample Input
100 4 2 1 2
Sample Output
12
Sample Explaination
12 种方案详情如下: {1}{2,3},{1}{2,4},{1}{3,4},{2}{1,3},{2}{1,4},{2}{3,4},{3}{1,2},{3}{1,4},{3}{2,4},{4}{1,2},{4}{1,3},{4}{2,3}
Hint
最近一直在做CRT,乍一看还以为又是一个水题,实际上并没有那么简单。
是时候来总结一下中国剩余定理CRT,并且开启奇妙的扩展卢卡斯定理ex_lucas了。
审题,题意很简单,要求 Π(i=1->m)C(n-∑(j=1->i-1)wj,wj)%P
组合数取模,很容易想到卢卡斯定理。
然而根据题意,P并不一定是质数,普通卢卡斯定理只适用于质数。
怎么办呢?那么你觉得我所说的ex_lucas是干什么用的呢?
如果我们把P质因数分解,不就得到了质数吗?
我们只需要求出ans%piki 然后再CRT解关于它们的余数方程,就好了呀。
简单介绍CRT:
对于余数方程xΞai(mod pi) 其中pi彼此互质。
设P=∏pi,则最小自然数解x=(∑P/pi*ai*si)%P;其中si表示方程(P/pi)*x+pi*y=1的解。
证明略。而对于pi不互质的情况需要ex_CRT,十分恶心不再这里介绍了。
1 //tim[i]即为pi,aans[i]即为a[i],prr即为P 2 int CRT(){ 3 int ans=0,x,y; 4 for(int i=1;i<=nom;++i){ 5 ex_gcd(prr/tim[i],tim[i],x,y); 6 x=(x%tim[i]+tim[i])%tim[i]; 7 ans=(ans+prr/tim[i]*aans[i]%prr*x%prr)%prr; 8 } 9 return ans; 10 }