首页 > 编程语言 >扩展欧几里得算法(exGcd)

扩展欧几里得算法(exGcd)

时间:2024-07-18 09:07:26浏览次数:10  
标签:lfloor gcd int 欧几里得 exGcd 算法 ax mod

扩展欧几里得算法(Extended Euclidean algorithm, EXGCD),常用于求 \(ax+by=c\) 的一组可行解。

过程


\(ax_1+by_1=\gcd(a,b)\)
\(bx_2+(a\mod b)y_2=gcd(b,a\mod b)\)
由欧几里得算法 : \(\gcd(a,b)=gcd(b,a \mod b)\)
所以 : \(ax_1+by_1=bx_2+(a \mod b)y_2\)
又因为 : \(a \mod b=a-(\lfloor \frac{a}{b} \rfloor \times b)\)
所以 : \(ax_1+by_1=bx_2+((a-\lfloor \frac{a}{b} \rfloor \times b))y_2\)
\(ax_1+by_1=bx_2+ay_2-\lfloor \frac{a}{b} \rfloor \times by_2=ay_2+b(x_2-\lfloor \frac{a}{b} \rfloor y_2)\)
因为 \(a=a, b=b\) 所以 \(x_1=y_2, y1=x2-\lfloor \frac{a}{b} \rfloor y_2\)
那么就可以将这个过程一直进行下去,直到 \(\gcd\) 为 \(0\) 返回 \(x=1,y=0\)。

代码

int exGcd(int a, int b, int &x, int &y) {
	if (!b) {
		x = 1, y = 0; // gcd 为 0
		return a; 
	}
	int d = exGcd(b, a % b, x, y);
	int t = x;
	x = y;
	y = t - (a / b) * y;
	return d;
} 

例题

Luogu P5656 【模板】二元一次不定方程 (exgcd)

先用裴蜀定理检查是否有解,再用 exGcd 求特解,最后调整解,使得满足题目条件。
时间复杂度 \(O(log(N))\)

Luogu P1082 [NOIP2012 提高组] 同余方程

将 \(ax \equiv 1(\mod b)\) 变形成 \(ax+by=1\) 用 exGcd 解决就行了。

标签:lfloor,gcd,int,欧几里得,exGcd,算法,ax,mod
From: https://www.cnblogs.com/Tom-tanjiaqi/p/18308679

相关文章

  • 排序算法(4)之快速排序(1)
     个人主页:C++忠实粉丝欢迎点赞......
  • 排序算法汇总
    目录直接插入排序希尔排序选择排序冒泡排序快速排序归并排序二路归并算法归并排序算法自顶向下归并排序:(注意配合上述二路归并算法共同实现)自底向上归并排序:计数排序桶排序算法计数排序算法基数排序最低位优先基数排序:最高位优先基数排序:基数排序小结堆排序经典排序算法小结关键值......
  • 几种常见的软件算法
    几种常见的软件算法,包括它们的原理、实现步骤以及时间空间复杂度。以下是对这些算法的详细归纳总结:快速排序法(QuickSort)原理:使用分治法策略,通过选取基准值将列表分为两部分,一部分包含小于基准值的元素,另一部分包含大于基准值的元素。实现步骤:选择基准值。将数组分为两......
  • Clarke-Wright节约算法详解与Python代码示例
    Clarke-Wright节约算法详解与Python代码示例一、算法详解Clarke-Wright节约算法(简称C-W算法),也称为节约里程法或节约算法,是由Clarke和Wright于1964年提出的一种启发式算法。该算法主要用于解决车辆路径问题(VehicleRoutingProblem,VRP),特别是在运输车辆数目不确定的情况下......
  • 冒泡排序算法
    冒泡排序算法点击查看代码/*冒泡排序,英语:BubbleSort,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序,如:从大到小、首字母从A到Z。错误就把他们交换过来。*/#include<stdio.h>voidbubble_sort(intarr[],intlen);intmain(){......
  • 「代码随想录算法训练营」第十三天 | 二叉树 part3
    110.平衡二叉树题目链接:https://leetcode.cn/problems/balanced-binary-tree/题目难度:简单文章讲解:https://programmercarl.com/0110.平衡二叉树.html视频讲解:https://www.bilibili.com/video/BV1Ug411S7my题目状态:通过思路:采用递归的方式,遍历每个节点的左右孩子的深度......
  • 代码随想录算法训练营第14天 | 复习二叉树翻转
    2024年7月17日递归法翻转二叉树易错:要考虑节点为空的情况,以及写好边界条件。/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.va......
  • 【数据结构与算法】选择排序篇----详解直接插入排序和哈希排序【图文讲解】
     欢迎来到CILMY23的博客......
  • C++ 贪心算法
    理解贪心算法贪心算法采用的是贪心策略在每一步中都采取最优解(局部最优解),以期望得到最终的全局最优解例子#include<iostream>#include<bits/stdc++.h>usingnamespacestd;intmain(){ inta[510]={0};//表示每个人的打水时间的数组 intr,n,s=0;//水......
  • 代码随想录算法训练营第26天 | 回溯02:39. 组合总和、40.组合总和II、131.分割回文串
    代码随想录算法训练营第26天|回溯02:39.组合总和、40.组合总和II、131.分割回文串组合总和https://leetcode.cn/problems/combination-sum/代码随想录https://programmercarl.com/0039.组合总和.html40.组合总和IIhttps://leetcode.cn/problems/combination-sum-ii/desc......