• 逆元简录


    (大部分摘录
    如果 a,p不互质的话 a是没有逆元的
    1.存在唯一性
    对于 a 来说,它只会有一个,且一定有一个逆元。
    这是为什么呢?
    我们先假设 a 有两个不相等逆元: a'和 a'',
    那么一定有:

    (qquad qquad qquad qquad qquad qquad quad a*a'equiv a*a''equiv1)

    不妨设(a'<a''且 a''-a'=k),那么
    (qquad qquad qquad qquad qquad qquad ; a*(a''-k)equiv a*a'' pmod p)
    (qquad qquad qquad qquad qquad qquad ;a∗a''−a∗k≡a∗a''pmod p)
    (qquad qquad qquad qquad qquad qquad qquad a*kequiv0 pmod p)
    由于(a eq 0,所以 kequiv 0pmod p ,即 a'equiv a''),与假设矛盾,所以 a 只能有一个逆元。

    • 完全积性函数:
      两个数的逆元的积等于这两个数积的逆元
    • (a*b^{-1}equiv a/b pmod p)

    求法

    • (单个)求法一:枚举法
      枚举 kk ,检查是否满足 (a*kequiv1 pmod p)
    • (单个) 费马小定理:
      (当 p 为素数时, a^{p-1}equiv1pmod p。)
      (那么 a*a^{p-2}equiv1pmod p .)
      (x=a^{p-2})
    • (单个)求法三:扩展欧几里得
    • (批量)求法四:欧拉筛
    • (批量)求法五:线性递推

    模板->线性递推(题解有一篇证得好)

    #include<bits/stdc++.h>
    #define re return
    #define inc(i,l,r) for(int i=l;i<=r;++i)
    typedef long long ll;
    template<typename T>inline void rd(T&x)
    {
        char c;bool f=0;
        while((c=getchar())<'0'||c>'9')if(c=='-')f=1;
        x=c^48;
        while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);
        if(f)x=-x;
    }
    using namespace std;
    ll n,p,inv[3000006];
    int main()
    {
        rd(n),rd(p);
        inv[1]=1;
        printf("1
    ");
        inc(i,2,n)
            inv[i]=(p-p/i*inv[p%i]%p),printf("%d
    ",inv[i]);
    }
    
  • 相关阅读:
    UVA 439 Knight Moves
    UVA 673 Parentheses Balance
    UVa 536 Tree Recovery
    UVA 712 S-Trees
    UVA 12657 Boxes in a Line
    UVA 679 Dropping Balls
    UVA 1603 Square Destroyer
    UVA 1343 The Rotation Game
    UVA 1374 Power Calculus
    UVA 12558 Egyptian Fractions (HARD version)
  • 原文地址:https://www.cnblogs.com/lsyyy/p/11252709.html
Copyright © 2020-2023  润新知