hdu 2669 Romantic(线性同余,扩展欧几里得)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2669

题目大意:找出一组x,y使ax+by=1,如果找不出则输出“sorry”。

解题思路:有两个点需要注意,一个点:由定理可得,如果a,b不互质即__gcd(a,b)大于1就不满足上式,这时我们就需要输出“sorry”。
另一个点,(刚开始第二个点不懂,有些大佬的博客就放个代码,我否了)需要满足x>=0,(还不知道为什么),一组解(x,y)可以写成(x+kb,y-ka)的形式,要满足x>=0,只需要将x一直加b,y一直减去a直到x>=0。

Code:

#include<iostream>
#include<algorithm>

using namespace std;

int exgcd(int a,int b,int &x,int &y){//扩展欧几里得算法模板 
	if(b==0){
		x=1;y=0;
		return a;
	}
	int r = exgcd(b,a%b,x,y);
	int t = y;
	y=x-(a/b)*y;
	x=t;
	return r;
}

int main(){
	int a,b,x,y;
	while(cin>>a>>b){
		if(__gcd(a,b)>1){//如果a,b的最大公约数大于1,就不满足条件 
			cout<<"sorry\n";
			continue;
		}
		int r = exgcd(a,b,x,y);
		while(x<0){//加到x>=0为止 
			x+=b;
			y-=a;
		}
		cout<<x<<" "<<y<<endl;
	}
	
	
	return 0;
}```

posted @ 2019-08-14 14:39  voids5  阅读(77)  评论(0)    收藏  举报