• 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;
    }
     
  • 相关阅读:
    centos7 源码安装python3
    gitlab 迁移
    gitlab 搭建
    亚伦史沃茨 公开信
    误删了sudo包怎么办
    在中国历史上,我个人最喜欢的三个皇帝
    安装PHP7
    Mac OS上设置Django开发环境
    The Pragmatic Programmer Quick Reference Guide
    Nginx的第一个模块-HelloWorld
  • 原文地址:https://www.cnblogs.com/a249189046/p/8409232.html
Copyright © 2020-2023  润新知