扩展gcd求解二元不定方程及其证明

#include <cstdio>
#include <iostream>

using namespace std;
/*扩展gcd证明
	因为当d = gcd(a,b)时;
	d = d1 = gcd(b,a%b);
	d1 = b1x1 + a%by1;
	d = ax+by = b1x1+a%by1,又因为a%b = a - a%b*b;
	上式变形可以有
	b1x1 + (a-b*a/b)*y1 = a*y1 + b*(x1-a/b*y1);
	也就是是说ax+by =  a*y1 + b*(x1-a/b*y1);
	所以当x=y1,y = x1-a/b*y1时,可以满足有d=ax+by;
 */
int fun(int a,int b,int d,int &x,int &y){
	if(b == 0){
		x = 1;
		y = 0;
		return a;
	}
	else{
		d = fun(b,a%b,d,x,y);
		int t;
		t = x;
		x = y;
		y = t-a/b*y;
		return d;
	}
}

int main(){
	int a,b,d;
	cin >>a >> b >> d;
	int x,y;
	fun(a,b,d,x,y);
	printf("%d %d\n",x,y);
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-26 05:27:52

扩展gcd求解二元不定方程及其证明的相关文章

扩展gcd codevs 1200 同余方程

codevs 1200 同余方程 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入描述 Input Description 输入只有一行,包含两个正整数 a, b,用 一个 空格隔开. 输出描述 Output Description 输出只有一行包含一个正整数x0,即最小正整数解,输入数据保证一定有解. 样例输入 Sa

扩展欧几里得与二元不定方程

二元不定方程,就是形同ax+by=c的二元方程, 只不过有无数组解罢了. 还有原谅我蒟蒻,不会用字母的写法,只好直觉+小学数学写法了 我们可以使用辗转相除法来解决(过渡好生硬啊) 我们首先来看一组例子 为了方便理解,特将每个多项式系数都写了出来,同时并没有将符号带进括号 37x-107y=25 37x-(37*2+33)y=25 37(x-2y)-33y=25 (-33*-1+4)(x-2y)-33y=25 -33(-x+3y)+4(x-2y)=25 (4*-8-1)(-x+3y)+4(x-2y

poj2115--C Looooops(扩展gcd)

C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17740   Accepted: 4600 Description A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; variable != B; variable += C) statement; I.e., a loop w

UESTC 288 青蛙的约会 扩展GCD

设两只青蛙跳了t步,则此时A的坐标:x+mt,B的坐标:y+nt.要使的他们在同一点,则要满足: x+mt - (y+nt) = kL (p是整数) 化成: (n-m)t + kL = x-y (L > 0)  则变成求解同余方程: (n-m)t ≡ (x-y) mod L  ,用扩展gcd解决. 且此时当 (x-y) % gcd(n-m,L) == 0 时才有解. 解同余方程ax+by = m时,假设我们已经求出了一对x0,y0,则 x0 = x*m/gcd(a,b) ,此时x0可能不是正整数

poj1061——扩展gcd水题

poj1061——扩展gcd水题 青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 94176   Accepted: 17413 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉

HDOJ 2769 Disgruntled Judge 扩展GCD

扩展GCD: 枚举a,扩展GCD求b,再暴力检查 Disgruntled Judge Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 329    Accepted Submission(s): 142 Problem Description Once upon a time, there was an nwerc judge with

2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展gcd, 不是用逆元吗.. 网上还有别人的解释,没看懂,贴一下: (a / b) % m = ( a % (m*b)) / b 笔者注:鉴于ACM题目特别喜欢M=1000000007,为质数: 当gcd(b,m) = 1, 有性质: (a/b)%m = (a*b^-1)%m, 其中b^-1是b模m的逆

GCD最大公约数递归定理的证明

定理如下: 对任意非负整数a和任意正整数b, gcd(a,b) = gcd(b,a mod b) 首先证明 gcd(a,b) | gcd(b,a mod b) 设 gcd(a,b) = d a mod b = a - b*k (k = a/b 向下取整的整数) 易得 d | a mod b 和 d | b 得出 d | gcd(b,a mod b) (d 为 最大公约数的一个因数) 接下来证明 gcd(b,a mod b) | gcd(a,b) 设 gcd(b,  a mod b) = d 得

poj 2891 Strange Way to Express Integers (扩展gcd)

题目链接 题意:给k对数,每对ai, ri.求一个最小的m值,令m%ai = ri; 分析:由于ai并不是两两互质的, 所以不能用中国剩余定理. 只能两个两个的求. a1*x+r1=m=a2*y+r2联立得:a1*x-a2*y=r2-r1;设r=r2-r2; 互质的模线性方程组m=r[i](mod a[i]).两个方程可以合并为一个,新的a1为lcm(a1,a2), 新的r为关于当前两个方程的解m,然后再和下一个方程合并--.(r2-r1)不能被gcd(a1,a2)整除时无解. 怎么推出的看了好