zoukankan      html  css  js  c++  java
  • 扩展卢卡斯

    扩展卢卡斯用于求模数不是质数且(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}))次组合数,直接套扩展卢卡斯即可。

  • 相关阅读:
    一周见闻速记
    glibc下的内存管理
    流(flow)
    Liunx学习笔记
    逆向工程androidAPK(待补充)
    Ubuntu Linux环境搭建|软件篇
    Ubuntu Linux 源记录
    android 权限
    Android源码下载(ubuntu12.04(amd64))
    游戏外挂编程之神器CE的使用
  • 原文地址:https://www.cnblogs.com/skiceanAKacniu/p/13285883.html
Copyright © 2011-2022 走看看