hdu 2669 Romantic 扩展欧几里得
Now tell you two nonnegative integer a and b. Find the nonnegative integer X and integer Y to
satisfy X*a + Y*b = 1. If no such answer print "sorry" instead.
Input
The input contains multiple test cases.
Each case two nonnegative integer a,b (0<a, b<=2^31)
Output
output nonnegative integer X and integer Y, if there are more answers than the X smaller one
will be choosed. If no answer put "sorry" instead.
Sample Input
77 51
10 44
34 79
Sample Output
2 -3
sorry
7 -3
思路:exgcd 最后X为最小正解
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 ll exgcd(ll a, ll b, ll &x, ll &y) { 5 if(!b) { 6 x=1;y=0;return a; 7 } 8 ll ans=exgcd(b,a%b,x,y); 9 ll temp=x; 10 x=y; 11 y=temp-a/b*y; 12 return ans; 13 } 14 int main() { 15 ios::sync_with_stdio(false); 16 ll a,b,x,y; 17 while(cin>>a>>b) { 18 ll g=exgcd(a,b,x,y); 19 if(g!=1) { 20 cout<<"sorry"<<endl; 21 } else { 22 x=(x%b+b)%b; 23 y=(1-a*x)/b; 24 cout<<x<<" "<<y<<endl; 25 } 26 } 27 return 0; 28 }