• 卢卡斯定理&扩展卢卡斯定理


    卢卡斯定理

      求(C_m^n~mod~p)

      设(m={a_0}^{p_0}+{a_1}^{p_1}+cdots+{a_k}^{p_k},n={b_0}^{p_0}+{b_1}^{p_1}+cdots+{b_k}^{p_k})

      则(C_m^nequivprod{C_{a_i}^{b_i}}(mod~p))

    扩展卢卡斯定理

      好像这也不是什么定理,只是一个计算方法

      计算(C_m^n~mod~p),其中(p={p_1}^{q_1} imes{p_2}^{q_2} imescdots{p_k}^{q_k})时,我们可以先求出(C_m^n~mod~{p_i}^{q_i}),然后用CRT合并。

      那么怎么计算(C_m^n~mod~{p_i}^{q_i})呢?

      (C_m^n=frac{m!}{n!(m-n)!}),我们只需要算出(m!,{n!}^{-1},{(m-n)!}^{-1}),然后乘在一起。

      zjt大爷:(n!)可能在模({p_i}^{q_i})的意义下没有逆元啊,那这就是错的了啊

      其实这里求得不是逆元(可能没有逆元),求出来的是(a imes {p_i}^b(gcd(a,p)=1)),前面的(a)用逆元,后面的次数加加减减一下就好了

      问题转换成求(n!~mod~p^q)

      例如(n=19,p=3,q=2)

    [egin{align} &19!\ =&1 imes2 imes3 imescdots imes19\ =&(1 imes2 imes4 imes5 imes7 imes8cdots imes16 imes17 imes19) imes(3 imes6 imes9 imes12 imes15 imes18)\ =&(1 imes2 imes4 imes5 imes7 imes8cdots imes16 imes17) imes19 imes3^6 imes(1 imes2 imes3 imes4 imes5 imes6)\ =&{(1 imes2 imes4 imes5 imes7 imes8)}^2 imes19 imes3^6 imes(1 imes2 imes3 imes4 imes5 imes6) end{align} ]

      上面这个式子分为四部分:

      第一部分:({(1 imes2 imes4 imes5 imes7 imes8)}^2)。这部分的数不超过(p^q)个,可以暴力算

      第二部分:(19)。这部分的数不超过(p^q)个,可以暴力算

      第三部分:(3^6)。这个在最后处理时求出(m!,n!,(m-n)!)分别有多少个(p)(设为(x,y,z)),则答案要乘上(p^{x-y-z})

      第四部分:(1 imes2 imes3 imes4 imes5 imes6)。这个是(lfloorfrac{n}{p} floor!),可以递归处理

  • 相关阅读:
    golang之panic,recover,defer
    Golang之函数练习
    Golang之strings包
    Golang之字符串操作(反转中英文字符串)
    keil中使用——变参数宏__VA_ARGS__
    到底该不该用RTOS——rtos的优点
    c语言联合union的使用用途
    c语言的#和##的用法
    c语言位域的使用注意事项——数据溢出
    基于 Keil MDK 移植 RT-Thread Nano
  • 原文地址:https://www.cnblogs.com/ywwyww/p/8510973.html
Copyright © 2020-2023  润新知