首页 > 其他分享 >扩展欧几里得

扩展欧几里得

时间:2022-09-18 20:25:58浏览次数:65  
标签:return yy0 int 欧几里得 扩展 frac x0 式子

考虑问题求\(\ ax\equiv 1\pmod{b}\)的最小整数解,其中\(2 \leqslant a,b \leqslant 2000000000\)
\(\\\)
数据范围这么大我们肯定不能枚举,考虑别的方法。
\(\\\)
发现问题可以转化为:求\(ax_0+by_0=1\)的最小整数解\(x_0\)(此时\(y\)应该是负的)。
我们另写一个式子:\(bx_1 + (a-\lfloor \frac{a}{b} \rfloor)y_1 = 1\),整理下这个式子,得到\(ay_1+b\left( x_1- \lfloor \frac{a}{b}y_1\rfloor \right)=1\)
\(\\\)
这两个式子对应相等,我们可以得到关系:\(x_0 = y_1, y_0=x_1 - \lfloor \frac{a}{b}\rfloor y_1\),得到第二个式子,我们就是运用辗转相除的结果来变成系数,所以在\(log\)复杂度下我们会得到\(a_nx_n + b \times 0 = 1\),因为由裴属定理,这个不定方程要有解,则\(\gcd(a,b) | 1\),所以只能\(\gcd(a,b)=1\),所以最后\(a_n\)必定为1(我们由辗转相除来的),此时我们可以直接取\(x_n=\frac{1}{a_n}=1,y_n=0\),然后回代即可。
\(\\\)
注意最后我们要得到最小正整数解,我们通过这个方式得到的不一定是正数,可以通过\(x_0=((x_0\mod b)+b)\mod b\)来解决问题。因为当\(x_0<0\)时,\(x_0\mod b\)会结果为\(-\left( -x_0\mod b \right)\),所以这样就可以得到一个大于\(-b\)的负数,再加\(b\)即可得到最小的正数,如果\(x_0\)为正数,那么\(+b\)再\(\mod b\)没有影响。
\(\\\)

using namespace std;

int x0, yy0;

inline int read() {
	int x = 0, f = 1;
	char c = getchar();
	while (!isdigit(c)) {
		if (c == '-') f = -1;
		c = getchar();
	}
	while (isdigit(c)) x = x * 10 + c - '0', c = getchar();
	return x * f;
}

inline void exgcd(int a, int b) {
	if (b == 0) {
		x0 = 1, yy0 = 0;
		return ;
	}
	exgcd(b, a % b);
	int temp = x0;
	x0 = yy0;
	yy0 = temp - (a / b) * yy0;
	return ;
}

int main() {
	int a, b;
	a = read(), b = read();
	exgcd(a, b);
	x0 = (x0 % b + b) % b;
	printf("%d", x0);
	return 0;
}

标签:return,yy0,int,欧几里得,扩展,frac,x0,式子
From: https://www.cnblogs.com/Miraclys/p/16705253.html

相关文章

  • 扩展条件格式的应用范围
    问题: 应用于某一单元格的条件格式扩展到其他单元格,假设带条件格式的单元格为E1,需要扩展至E2:E12。 方法1:格式粘贴选取E1》复制》选取E1:E12》粘贴》选择性粘贴》......
  • 5 个不那么著名的 VS 代码扩展
    5个不那么著名的VS代码扩展VSCode是最流行和广泛使用的代码编辑器之一。VSCode最好的部分是它的灵活性和可扩展性。有数以百万计的开发人员为vscode开发扩展......
  • 数据类型扩展及面试题讲解
    数据类型扩展及面试题讲解importjava.math.BigDecimal;​publicclassdemo03{  publicstaticvoidmain(String[]args){    //整数拓展 进制二进......
  • PHP扩展之Yaconf
    这个是继鸟哥出品的yaf,yar之后的又一个好用的工具. Yaconf配置管理工具具体可以看鸟哥的文档: https://www.laruence.com/2015/06/12/3051.html  Yaconf的特点:......
  • 用C++ 编写QML 扩展
    用C++编写QML扩展Qt,QML,QtQuick这是关于用C++来扩展QML的教程。源文:WritingQMLExtensionswithC++QtQML模块提供了一系列API以实现通过C++来扩展QML。可以编写扩......
  • 如何把 iPad 作为 Mac 扩展屏幕使用 All In One
    如何把iPad作为Mac扩展屏幕使用AllInOne将iPad用作Mac的第二个显示屏您可以通过无线方式使用“随航”,但要在使用过程中持续为iPad充电❌不好使呀使用......
  • 适合初学者的最佳 VSCode 扩展 2022
    适合初学者的最佳VSCode扩展2022可以说,VisualStudioCode(VSCode)是最流行的开源代码编辑器。它归微软所有,效果惊人。VSCode旨在提供一个高效的环境,为您的日常编......
  • JAVA中自定义扩展Swagger的能力,自动生成参数取值含义说明,提升开发效率
    大家好,又见面了。在JAVA做前后端分离的项目开发的时候,服务端需要提供接口文档供周边人员做接口的对接指导。越来越多的项目都在尝试使用一些基于代码自动生成接口文档的工......
  • A Secret HDU - 6153 扩展KMP || KMP
    题目链接:https://vjudge.net/problem/HDU-6153题意求一个串T的所有后缀在串S中出现的次数,最后再求和。扩展KMP解法可以利用拓展KMP求出S的每一个后缀和T的最长公共前......
  • [前端][一本][6分] 项目部分的描述可以多加扩展
    关注【校招VIP】公众号,回复【简历】,添加校招顾问微信,即可获取简历指导!本份简历是一位21届一本前端同学的简历,简历评分6分。一、学员简历二、指导意见简历版式没有问题......