码迷,mamicode.com
首页 > 其他好文 > 详细

HDU2669 Romantic (扩展欧几里德)

时间:2018-02-03 16:13:44      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:exgcd   class   存在   name   man   ret   algo   roman   hdu   

Girls are clever and bright. In HDU every girl like math. Every girl like to solve math problem! 
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. 

InputThe input contains multiple test cases. 
Each case two nonnegative integer a,b (0<a, b<=2^31) 
Outputoutput 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

扩展欧几里德的模板题,只有当1模上gcd等于0的时候,解才存在。
解存在的时候,通过扩展欧几里德求出 特解x0,y0;
然后用通解公式x=x0+k*(b/gcd)
y=y0-k*(a/gcd)
求出最小非负数x,和对应的y;

代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
LL a,b;
LL exgcd(LL a,LL b,LL &x, LL &y)
{
  if(b==0)
  {
      x=1;
      y=0;
      return a;
  }
    LL r=exgcd(b,a%b,x,y);
    LL t=x;
    x=y;
    y=t-a/b*y;
    return r;
}
int main()
{
    LL x,y,x1,y1,k;
    while(cin>>a>>b)
    {
      LL gcd=exgcd(a,b,x,y);
      LL c=1;
      if(c%gcd!=0)
      puts("sorry");
      else
      {
        x1=((x*c/gcd)%(b/gcd)+(b/gcd))%(b/gcd);
        k=(x1-x)/(b/gcd);
        y1=y-(a/gcd)*k;
        cout<<x1<<" "<<y1<<endl;
      }
    }
    return 0;
}

 

 

HDU2669 Romantic (扩展欧几里德)

标签:exgcd   class   存在   name   man   ret   algo   roman   hdu   

原文地址:https://www.cnblogs.com/a249189046/p/8409232.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!