首页 > 编程语言 >【数学】【模板】扩展欧几里得算法

【数学】【模板】扩展欧几里得算法

时间:2024-07-22 09:20:55浏览次数:15  
标签:lfloor gcd int 欧几里得 算法 ax 模板

扩展欧几里得算法

思想

首先回忆一下裴蜀定理:对于任意一对不全为 \(0\) 的整数 \(a, b\),存在 \(x, y\) 使得 \(ax + by = \gcd(a, b)\)。

扩展欧几里得算法就是求出一组解满足 \(ax + by = \gcd(a, b)\),这里用到了欧几里得算法,不会的,可以看看我的博客

我们看看怎么求:

  1. 当 \(b = 0\) 的时候,\(ax = \gcd(a, b) = a\),那么 \(x = 1\)。
  2. 当 \(a \ne 0\) 且 \(b \ne 0\) 时,我们递归求解出 \((a\bmod b)x_1 + by_1 = \gcd(a, b)\) 后再计算 \(ax + by = \gcd(a, b)\)。

从 \(x_1, y_1\) 推出 \(x, y\):

\[\begin{aligned} (a\bmod b)x_1 + by_1 &= \gcd(a, b)\\ (a - \left\lfloor\dfrac{a}{b} \right\rfloor\cdot b)x_1+by_1&= \gcd(a, b)\\ ax_1 - \left\lfloor\dfrac{a}{b} \right\rfloor\cdot bx_1+by_1&= \gcd(a, b)\\ ax_1+b(y_1 - \left\lfloor\dfrac{a}{b} \right\rfloor\cdot x_1) &= \gcd(a, b) \end{aligned} \]

所以 \(x = x_1, y = y_1 - \left\lfloor\dfrac{a}{b} \right\rfloor\cdot x_1\)。

然后就在欧几里得算法的时候顺便求出来了。

代码

int exgcd(int a, int b, int &x, int &y) {
    if (!b) {
        x = 1, y = 0;
        return a;
    }
    int g = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return g;
}

练习题

My Blog : AcWing 878. 线性同余方程题解

标签:lfloor,gcd,int,欧几里得,算法,ax,模板
From: https://www.cnblogs.com/Yuan-Jiawei/p/18315351

相关文章

  • 【数学】【模板】欧拉定理
    欧拉定理思想若\(a\)与\(n\)互质,则\(a^{\varphi(n)}\equiv1\pmodn\);容易得出当\(n\)为质数时,\(a^{n-1}\equiv1\pmodn\)。证明假设与\(1\simn\)中与\(n\)互质的数字为\(x_1,x_2,x_3,\cdotsx_{\varphi(n)}\),且两两不同。现将它们全部乘以\(a\)得......
  • 【数学】【模板】欧拉函数
    欧拉函数思想\(\varphi(n)\)表示的是\(1\simn\)中与\(n\)互质的个数。怎么求\(\varphi(n)\)呢?先将\(n\)质因数分解:\(n=p_1^{a_1}p_2^{a_2}\cdotsp_k^{a_k}\),那么\(\varphi(n)=n\left(1-\dfrac{1}{p_1}\right)\left(1-\dfrac{1}{p_2}\right)\cdots\left......
  • 【数学】【模板】欧几里得算法
    欧几里得算法思想\[\gcd(a,b)=\gcd(b,a\bmodb)\]证明\(\gcd(a,b)=\gcd(b,a\bmodb)\):首先,如果有\(d|a\),\(d|b\),那么\(d|ax+by\)。然后,\(a\bmodb=a-\left\lfloor\dfrac{a}{b}\right\rfloorb\)。假设\(p=\gcd(a,b)\),那么\(p|......
  • 【搜索】【模板】A* 算法
    学了IDA*,然后学学A*。A*A*可以简单理解为在bfs的时候分个先后,哪个最有可能先到达就先走哪一步。A*是在某个最短路问题中(比如求最小的步骤等),如果所有边权都是非负的,那么就可以使用启发函数来优化bfs过程。例题P1379八数码难题思路我们在bfs的过程中加入函数\(h......
  • 【数据结构】【模板】莫队
    莫队使用场景离线算法;区间询问不断修改。能用\(O(1)\)的时间复杂度从\([l,r]\)到\([l+1,r]\)或者\([l,r-1]\)。原理原问题可以转化为为建立一个坐标轴,对于一个询问\((l,r)\),相当于点\((l,r)\),从一个询问\((a,b)\)到\((c,d)\),可以理解为点\((a,b)......
  • 【图论】【模板】差分约束系统
    差分约束系统差分约束系统是将不等式组的问题转化为图论问题。前置知识判断负环例题P5960【模板】差分约束算法思路我们将\(x_u-x_v\ley_u\)换为\(x_u\lex_v+y_u\)。然后我们建立一条连接\(v,u\)(注意是\(v,u\)不是\(u,v\))权值为\(y_u\)的边。我们发......
  • 【图论】【模板】最长路、最短路
    最短路Dijkstra算法思路Dijkstra算法,采用贪心思想,在某一时刻如果\(dis\)数组中\(dis_u\)最小,那么就固定\(u\),\(dis_u\)一定是\(1\rightarrowu\)的最短路径,然后我们再通过\(u\)更新与\(u\)有边相连的\(v\),如果\(dis_v>dis_u+w\),那么\(dis_v=dis_u+w\)......
  • 【图论】【模板】判断负环
    使用SPFA算法判断负环前言判断负环是属于判定性的问题,常与二分结合起来。例题AcWing852.spfa判断负环思路可以使用SPFA进行判断。因为两点之间至多有\(n-1\)条边,所以当一个点的最短路径经过的边数大于等于\(n\)时,说明有负环。代码#include<bits/stdc++.h>......
  • 【搜索】【模板】模拟退火
    前置知识自然对数、分数次幂、概率。前言模拟退火可以在我们想不到题目正解的时候试一试其实就是骗分方法。因为纯随机得出正确答案的概率非常低,所以我们就可以加一定的优化,使找到答案概率增大。算法思想温度(步长):每次选择一个范围进行搜索,在搜索过程中范围不断缩小,最后到很......
  • 算法学习(算法笔记胡凡)
    目录考生排序递归问题数塔问题回文字符串棋盘覆盖问题盒分形自然数分解之最大积自然数分解之方案数01串STL练习迭代器的使用考生排序https://sunnywhy.com/sfbj/4/1/92结构体的使用,sort函数的使用递归问题数塔问题https://sunnywhy.com/sfbj/4/3/116动态规划问题dp例如给......