扩展卢卡斯

扩展卢卡斯用于求模数不是质数且\(n,m\)很大时的\(\dbinom nm\)

讲解

简单讲一下原理:

首先把模数\(m\)因子分解,写成若干\(p_i^{\alpha_i}\)的乘积的形式。我们可以求出\(\dbinom nm\mod p_i^{\alpha_i}\)的值,再用中国剩余定理构造出答案。

\(\dbinom nm=\dfrac{n!}{m!(n-m)!}\),考虑把阶乘拆成\(a\times p^b\)的形式,满足\(p\nmid a\),于是\(\dbinom nm=\dfrac{a_n}{a_{m}a_{n-m}}p^{b_n-b_m-b_{n-m}}\),左侧算逆元,右侧快速幂。

因为\(\lfloor\dfrac xk\rfloor+\lfloor\dfrac yk\rfloor\le\lfloor\dfrac {x+y}k\rfloor\),所以\(b_m+b_{n-m}\le b_n\),所以这里快速幂没毛病。


下面拆\(n!\),以\(n=22,p=3,\alpha=2\)为例

\(22!=(1\cdot2\cdot4\cdot5\cdot7\cdot8)(10\cdot11\cdot13\cdot14\cdot16\cdot17)\cdot 19\cdot20\cdot22\cdot(3\cdot6\cdot9\cdot12\cdot15\cdot18\cdot21)\)

\(\quad\ \equiv(1\cdot2\cdot4\cdot5\cdot7\cdot8)^2\cdot (1\cdot2\cdot4)\cdot 3^7\cdot7!\pmod{3^2}\)

所以,设\(prod(j)=\prod\limits_{i\perp p,i\le j}i\),总结出规律\(n!=prod(p^\alpha)^{\lfloor\frac n{p^\alpha}\rfloor}\times prod(n\!\!\!\mod p^\alpha)\times p^{\lfloor\frac np\rfloor}\times\lfloor\frac np\rfloor!\)

(好像并没有名字听上去那么高深?)

其中,头两项可以\(O(p^\alpha)\)预处理\(O(1)\)查询。总共需要递归\(O(\log_p n)\)层,每层快速幂复杂度\(O(\log \dfrac n{p^\alpha})\),单次\(n!\)查询复杂度\(O(\log_pn\log \dfrac n{p^\alpha})=O(\dfrac{\log^2n}{\log p})\)

例题

P3301方程

\(T\le 5\)组数据。

给定方程(\(X_1,\cdots,X_n\)为变量)

\(X_1+X_2+\cdots+X_n=M\)

我们对第\(1\sim n_1\)个变量进行一些限制:\(X_i\le A_i\)

我们对第\((n_1 + 1)\sim (n_1+n_2)\)个变量进行一些限制:\(X_i\ge A_i\)

求:在满足这些限制的前提下,该方程正整数解的个数对\(m\)取模的值。

\(n,M\le 10^9; n_1,n_2\le 8;1\le A_i\le M\)

\(m\in\{10007,262203414=2\times 3\times 11\times 397\times 10007,437367875=5^3\times7^3\times101^2\}\)


题解

首先,\(X_i\ge A_i\)显然是逗你玩的。直接\(M -= A_i-1,A_i=1\)就行了。

其次,\(X_i\le A_i\)可看作\(X_i\ge A_i+1\)的反面,这样就可以用容斥原理把原问题转化为若干限制\(X_i>0\)的子问题。这是直接插板法解决的。

需要\(O(T2^{n_1})\)次组合数,直接套扩展卢卡斯即可。

posted @ 2020-07-11 22:31  acniu  阅读(152)  评论(0编辑  收藏  举报