zoukankan      html  css  js  c++  java
  • HDU2669 Romantic (扩展欧几里德)

    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;
    }
     
  • 相关阅读:
    bzoj1001 狼抓兔子
    bzoj1015 星球大战
    noip模拟赛 楼
    noip模拟赛 radius
    noip模拟赛 helloworld
    noip模拟赛 hungary
    noip模拟赛 gcd
    洛谷P3375【模板】KMP字符串匹配
    noip模拟赛 隔壁
    noip模拟赛 对刚
  • 原文地址:https://www.cnblogs.com/a249189046/p/8409232.html
Copyright © 2011-2022 走看看