BZOJ2142 礼物-扩展lucas
题意:
给定n及m个数a[1…m],再给定一个模数P,求$\sum_{i=1}^nC_{n-\sum_{j=1}^{i-1}a_j}^{a_i}$对P取模
($1≤n≤10_9,1≤m≤5$,设$ P=p_1^{c_1}\times p_2^{c_2}\times p_3^{c_3}\times …\times p_t^{c_t} $,$p_i$为质数,$1≤p_i^{c_i}≤10^5$)
Solution:
扩展lucas定理模板题
这个算法理解起来比较方便,但是写的时候就不是那么好写了…
我们把p拆成$p_1^{c_1}\times p_2^{c_2}\times p_3^{c_3}\times … \times p_t^{c_t}$的形式,这样我们只需要求出每个$C(n,m)%p_i^{c_i}$,再用CRT合并即可
而C(n,m)可以转化成阶乘及阶乘的逆元的乘积,由于扩欧求逆元要求互质,所以说我们计算阶乘时需要提取出和$p_i^{c_i}$互质的数
举一个其他博客用烂的栗子:
$p_i=3,c_i=2,n=19$
$n!=1\times 2\times 3\times 4\times 5\times 6\times 7\times 8\times ……\times 19$
$=[1\times 2\times 4\times 5\times 7\times 8\times … \times 16\times 17\times 19]\times (3\times 6\times 9\times 12\times 15\times 18)$
$=[1\times 2\times 4\times 5\times 7\times 8\times … \times 16\times 17\times 19]\times 3^6(1\times 2\times 3\times 4\times 5\times 6)$
发现后面的是$(\frac{n}{p_i})!$,于是递归即可。前半部分是以$p_i^{c_i}$为周期的$[1\times 2\times 4\times 5\times 7\times 8]=[10\times 11\times 13\times 14\times 16\times 17](\mod 9)$
最后会有孤立出来的19,可以证明孤立出的长度不超过$p_i^{c_i}$,暴力算即可
至于剩下的$3^6$之类的数,我们只要计算出n!,m!,(n-m)!里含有多少个$p_i$(不妨设a,b,c),那么a-b-c就是C(n,m)中p的个数,直接算一下就行。
代码:
1 |
|