• 乘法逆元


    hdu5976我的博客==

    在一些题目中题目可能会要求一个乘积对MOD一个大数取余输出,给个例子hdu5976

    在这道题目中我们用到了前缀乘预处理,降低时间复杂度,但在预处理的时候,会发现可能乘积会爆long long,那么怎么办

     这时我们这么干 f[i]=(f[i-1]*i)%MOD;

    而且在这道题中,我们最后要f[i]/i*k再取余,除法取余是不好取的,乘法的话就是(a*b)%MOD==a%MOD*b%MOD;

    如果用乘法逆元就可以把除法转换成乘法,除一个数就是乘以它的逆元,但要注意我们这里逆元是相对于MOD的

    定义:
    满足b*k≡1 (mod MOD)   即b*k%MOD==1%MOD==1的k值就是b关于MOD的乘法逆元。

    证:

    根据b*k≡1 (mod p)有b*k=p*x+1。
    k=(p*x+1)/b。
    把k代入(a*k) mod p,得:
    (a*(p*x+1)/b) mod p
    =((a*p*x)/b+a/b) mod p
    =[((a*p*x)/b) mod p +(a/b)] mod p
    =[(p*(a*x)/b) mod p +(a/b)] mod p
    //p*[(a*x)/b] mod p=0

    这里的p就是MOD,直接把别人的证明搬来了==

    (a/b)%MOD==(a*k)%MOD

    可以把k看做是b在MOD环境下的倒数

    求逆元的公式

    inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD

    递推求逆元

    inv[1]=1;//1的逆元显然是1

    for(i=2;i<n;i++)

    inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD

  • 相关阅读:
    类和接口的区别
    ref 和out的区别
    重载 重写 多态区别
    UML种类与类的关系
    Window.open() 全攻略
    C#委托
    RT Diagnostics Routines
    tar.bz2 解压命令。
    教你10招最有效防电脑辐射方法
    预处理,编译, 优化, 汇编, 链接
  • 原文地址:https://www.cnblogs.com/WHLdbk/p/6051706.html
Copyright © 2020-2023  润新知