zoukankan      html  css  js  c++  java
  • 数论quq

    一 . 最大公约数

    gcd(a,b)= gcd(b,a mod b)

    二 . 最小公倍数

    lcm(m,n)=(m*n)/ gcd(m,n)

    三 . 逆元

    1.定义:在mod p的意义下,x 的乘法逆元 x^(-1)满足x*x^(-1) ≡ 1 (mod 7)即 x*x^(-1)%p=1

                  x 的乘法逆元 x^(-1)存在且唯一,用inv[ x ]表示

                  符合结合律时,可在过程中任意取模,包括最值,求和,加法,减法,乘法  例如a*b(mod p)==(a%p)*(b%p)

                  但除法时不适用

    2.应用:求a / b(mod p)时,a 过大时,由于a / b=a*inv[ b ](mod p),可以通过求inv[ b ]计算,此时就可以过程中取模

    3.求乘法逆元:

              扩展欧几里得:a*inv[a]≡1 (mod b)等同于(a*inv[a])%b==1等同于inv[a]*a+yb==1等同于gcd(a,b)==1,所以a与b互质,求inv[a]*a+yb==1中inv[a]用扩展gcd

    #include<iostream>
    using namespace std;
    long long x,y;
    void exgcd(long long a,long long b,long long &x,long long &y)
    {
        if(!b){x=1;y=0;return;}
        exgcd(b,a%b,x,y);
        int z=x;
        x=y;
        y=z-y*(a/b);
    }
    int main()
    {
        long long a,b;
        cin>>a>>b;
        exgcd(a,b,x,y);                
        cout<<(x%b+b)%b<<endl;        //x可能是负数,而x%b<b,所以要加上一个b
    }

                   费马小定理:若p为素数,a为正整数,则有a ^(p-1)≡ 1(mod p),所以inv[ a ] = a^(p-2)

    #include<cstdio>
    #define ll long long
    using namespace std;
    ll n,p;
    ll kuai(ll x,ll k)
    {
        ll ans=1;
        while(k)
        {
            if(k&1) ans=(ans*x)%p;
            x=(x*x)%p;
            k>>=1;
        } 
        return ans;
    }
    int main()
    {
        scanf("%lld%lld",&n,&p);
        for(int o=1;o<=n;o++)  printf("%lld
    ",kuai(o,p-2));
    }

                       线性算法: 时间复杂度O(n)

    inv[1] = 1;
    for(int 2 = 1; i < p; ++ i)
        inv[i] = (p - p / i) * inv[p % i] % p;
  • 相关阅读:
    一个业务场景的优化讨论
    关于Box Anemometer的安装配置遇到的几个坑
    CentOS6.5内 MySQL5.7.19编译安装
    CentOS6.5内 Oracle 11GR2静默安装
    始祖公——陈憺 河浦人文 (转载)
    Andriod- 从网络下载文件保存到SDCARD里
    Android Studio 如何添加第三方插件
    Android- SharedPreferences的封装
    Java/Andriod- 常用的 Android Studio 快捷键
    Java/Andriod- 动态权限申请
  • 原文地址:https://www.cnblogs.com/QAQq/p/10309531.html
Copyright © 2011-2022 走看看