• 数学:乘法逆元-拓展GCD


    乘法逆元应用在组合数学取模问题中,这里给出的实现不见得好用

    给出拓展GCD算法:

    扩展欧几里得算法是指对于两个数a,b
    一定能找到x,y(均为整数,但不满足一定是正数)
    满足x*a+y*b=gcd(a,b)
    gcd(x,y)是指x 与 y的最大公约数

    有啥用呢?求解形如 a*x +b*y = c 的通解

    然后我们先介绍同余方程,再介绍乘法逆元

    同余方程
    a≡b(mod m) 等价于小学的运算式 b÷m 余数为a
    也就是a mod m=b

    其实介绍这个就是看怎么把≡拿掉

    乘法逆元
    ax ≡ 1 (mod m)
    我们称 x 是 a 关于 m 的乘法逆元
    可以等价于这样的表达式: a*x + m*y = 1

    当满足这个式子的时候:a*x + b*y = c 有解的充要条件: c % gcd(a , b) == 0

    一般,我们能够找到无数组解满足条件,但是一般是让你求解出最小的那组解

    我们求解出来了一个特殊的解 x0 ,我们用 x0 % m其实就得到了最小的解了

     1 #include<cstdio>
     2 using namespace std;
     3 inline long long read()
     4 {
     5     long long x=0,f=1;char ch=getchar();
     6     while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
     7     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
     8     return x*f;
     9 }
    10 int a,b;
    11 void exgcd(int a,int b,int &x,int &y)
    12 {
    13     if(b==0) {x=1;y=0;return;}
    14     exgcd(b,a%b,x,y);
    15     int t=x;x=y;y=t-a/b*y;
    16 }
    17 //ax ≡ 1 (mod b)
    18 //-> a*x + b*y = 1
    19 //->求出x和y后让x%b就是最小解了 
    20 int main()
    21 {
    22     a=read();b=read();
    23     int x,y;
    24     exgcd(a,b,x,y);
    25     x=(x%b+b)%b;
    26     printf("%d",x);
    27     return 0;
    28 }
  • 相关阅读:
    Elasticsearch深度应用(下)
    MongoDB基础入门
    MongoDB慢查询与索引
    Elasticsearch深度应用(上)
    Chrome实现自动化测试:录制回放网页动作
    Allure测试报告怎么设置
    接口测试中,应不应该用数据库
    Python函数默认参数避坑指南
    Python ModuleNotFoundError: No module named通俗的解释和方法
    怎么学自动化测试
  • 原文地址:https://www.cnblogs.com/aininot260/p/9480161.html
Copyright © 2020-2023  润新知