zoukankan      html  css  js  c++  java
  • noip复习——逆元

    逆元,即对给定(a,p (a perp p)),求(x)使得(ax equiv 1 (mod p))

    逆元可以看做(a)在模(p)意义下的(a^{-1})。因此,在模(p)意义下,可以用乘(a)的逆元的方式来代替除以(a)操作

    求单个数的逆元

    费马小定理求逆元

    (p)是质数且(aperp p)时 $$a^{p-1}equiv1quad (mod p) $$

    方程两边同时乘(a^{-1}),可以发现$$a^{-1}equiv a ^{p-2}quad(mod p)$$

    可以直接快速幂求 传送门

    欧拉定理求逆元

    欧拉定理可以适用于满足(aperp p)的情况 $$a^{varphi(p)}equiv 1quad (mod p) $$

    同理可得$$a^{-1}equiv a^{varphi(p)-1} quad (mod p) $$

    现在的问题变成了,如何求欧拉函数?

    1.线性筛(O(p))

    适用于多个模数的情况 传送门

    如果是单一模数怎么办呢?有更高效的做法

    2.(O(sqrt{p}))做法

    [varphi(p)=pprodlimits_{i}(1-frac1i) ]

    其中,(i)(p)的所有质因子

    #define LL long long
    LL get_phi(LL n)
    {
        LL sum = n;
        for (LL i = 1; i * i <= n; ++i)
            if (n % i == 0)
            {
                sum -= sum / i;
                while (n % i == 0)
                    n /= i;
            }
        if (n > 1)
            sum -= sum / n;
        return sum;
    }
    

    exgcd求逆元

    exgcd可以求解方程组(ax+by=c)的解,而求(a)在模(p)下的逆元可以转化为求(ax+py=1)的解

    求多个数的逆元

    线性求1~n的逆元

    题目传送门

    (p=ki+r,k=lfloorfrac pi floor. r=p mod i)

    则有(ki+r equiv 0quad (mod p)),乘(i^{-1},r^{-1})可得(kr^{-1}+i^{-1}equiv 0quad (mod p))

    所以(i^{-1}=-r^{-1}lfloorfrac pi floor)

    显然可以递推求解

    线性求n个数的逆元

    题目传送门

    先预处理出这n个数的前缀积(sum_i),然后求出这n个数积的逆元(suminv_n),那么(suminv_{i-1}=suminv_i*a_i)(inv_i=suminv_{i}*sum_{i-1})

  • 相关阅读:
    返回一个整数数组中最大子数组的和
    简单四则运算
    简单四则运算2设计思路
    三月份阅读计划
    简单四则运算的随机输入
    软件工程读书笔记(10)——第十章 软件测试
    软件工程读书笔记(11)——第十一章 软件演化
    构建之法阅读笔记(一)
    敏捷开发方法综述
    第四周进度条
  • 原文地址:https://www.cnblogs.com/happyLittleRabbit/p/10870915.html
Copyright © 2011-2022 走看看