扩展卢卡斯

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

讲解

简单讲一下原理:

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

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

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


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

(22!=(1cdot2cdot4cdot5cdot7cdot8)(10cdot11cdot13cdot14cdot16cdot17)cdot 19cdot20cdot22cdot(3cdot6cdot9cdot12cdot15cdot18cdot21))

(quad equiv(1cdot2cdot4cdot5cdot7cdot8)^2cdot (1cdot2cdot4)cdot 3^7cdot7!pmod{3^2})

所以,设(prod(j)=prodlimits_{iperp p,ile j}i),总结出规律(n!=prod(p^alpha)^{lfloorfrac n{p^alpha} floor} imes prod(n!!!mod p^alpha) imes p^{lfloorfrac np floor} imeslfloorfrac np floor!)

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

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

例题

P3301方程

(Tle 5)组数据。

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

(X_1+X_2+cdots+X_n=M)

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

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

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

(n,Mle 10^9; n_1,n_2le 8;1le A_ile M)

(min{10007,262203414=2 imes 3 imes 11 imes 397 imes 10007,437367875=5^3 imes7^3 imes101^2})


题解

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

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

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

原文地址:https://www.cnblogs.com/skiceanAKacniu/p/13285883.html