• lucas定理 +证明 学习笔记


    lucas定理

    p为素数

    [dbinom n mequivdbinom {n\%p} {m\%p} dbinom {n/p}{m/p}(mod p) ]

    左边一项直接求,右边可递归处理,不包含求组合数复杂度是(log_p(m))

    证明

    我们记(n=sp+q,m=tp+r,(q,r<p))

    [dbinom {sp+q} {tp+r} equiv dbinom {s} {t} dbinom {q} {r} (mod p) ]

    有这么一个性质(inom p dequiv0,0<d<p)

    我们考虑使用幂来检验
    利用扰动法(算两次)的思想

    [egin{aligned} (1+x)^n&equiv(1+x)^q*[(1+x)^p]^s (mod p)\ &equiv(1+x)^q*[sum_{t=0}^p inom p i x^i]^s(mod p)\ 根据上面的那个性质\ &equiv(1+x)^q*(1+x^p)^s(mod p)\ &equivsum_{i=0}^s inom s i x^{pt} * sum_{j=0}^qinom q j x^j(mod p)\ 则有\ (1+x)^{sp+q}&equivsum_{i=0}^s inom s i x^{pt} * sum_{j=0}^qinom q j x^j(mod p)\ sum_{k=0}^{sp+q}inom {sp+q} {k} x^k&equivsum_{i=0}^s inom s i x^{pt} * sum_{j=0}^qinom q j x^j(mod p)\ 左边x^{tp+r}的系数为inom {sp+q}{tp+r}&\ 右边x^{tp+r}的系数为inom s tinom q r &(因为q<p)\ 系数在mod意义下相等\ 得证 end{aligned} ]

    推广

    利用(lucas)定理可以(O(p))预处理逆元+(O(log_p(n)))回答询问
    那么p为合数呢?
    1.如果p较小
    方法1:
    (O(p))预处理出(p)内的素数,共(frac P {ln P})
    询问时扫一次素数
    求出n,m,n-m中含有该素数多少个,求一个素数出现多少次要翻倍log次
    复杂度(frac P {ln P}*log napprox n)
    方法2:
    将p分解质因数,每个lucas求一次,再用中国剩余定理
    2.如果p较大:
    有一篇FFT快速求n!的方法
    布吉岛有没有用
    先 挖坑

  • 相关阅读:
    C#中的Dictionary的使用
    关于加密和解密的方法
    单链表逆置
    稀疏矩阵存储
    数组内存地址
    堆和栈的区别
    vc++6.0快捷键
    springMvc-02
    SpringMvc-01
    数据库字段设置问题,具体问题具体分析
  • 原文地址:https://www.cnblogs.com/acha/p/6443839.html
Copyright © 2020-2023  润新知