HDURomantic

Problem - 1004 (hdu.edu.cn)

扩展欧几里得解决线性同余方程。先得到gcd的解,再恢复原解,因为知道通解的一般形式,所以通过模来得到最小正整数解。另一个可以通过相减,或者一样的操作。一个增加,另一个一定减少。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll x,y;
ll ex_gcd(ll a,ll b,ll &x,ll &y)
{
	if(b==0){x=1,y=0;return a;}
	ll d=ex_gcd(b,a%b,x,y);
	ll temp=x;
	x=y;y=temp-a/b*y;
	return d; 
}
int a,b;
int main()
{
	while(~scanf("%d%d",&a,&b))
	{
		ll c=1;
		ll k=ex_gcd(a,b,x,y);
		if(c%k!=0) printf("sorry\n");
		else 
		{
			ll p=c/k;
			x*=p;x=(x%b+b)%b;y*=p;y=(y%a-a)%a;
			//y=(c-a*x)/b;
			cout<<x<<" "<<y<<endl; 
		}
	}
	return 0;
}

  

 

posted @ 2021-07-14 21:32  mofan552  阅读(42)  评论(0)    收藏  举报