zoukankan      html  css  js  c++  java
  • HDU2669 第六周练习I题(扩展欧几里算法)

     第六周练习I题

    I - 数论,线性方程
    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
     

    Description

    The Sky is Sprite.  The Birds is Fly in the Sky.  The Wind is Wonderful.  Blew Throw the Trees  Trees are Shaking, Leaves are Falling.  Lovers Walk passing, and so are You.  ................................Write in English class by yifenfei 

    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. 
     

    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
     
     扩展欧几里德算法详解
    http://www.cnblogs.com/hfc-xx/p/4744462.html
    题解:紫书p313
    扩展欧几里得算法是 用来在已知a,b 求解一组x,y使得x*a+y*b=gcd(a,b)

     因为已知欧几里得算法gcd(a,b)=gcd(b,a%b)  所以x*a+y*b=gcd(a,b)=gcd(b,a%b)=x*b+y*a%b=x*b+y*(a-a/b*b)=y*a+(x-a/b*y)*b;       

     注意;a-a/b*b=a%b 这样就将a,b的线性组合化简b为a%b与的线性组合. 根据我的输出图可以看到: a,b都在减小,当b减小到0时, 我们就可以得出x=1,y=0; 然后递归回去就可以求出最终的x,y了

     
    #include<iostream>
    using namespace std;
    void gcd(int a,int b,int & d,int &x,int &y)
    {
        if(!b)
        {
                d=a;x=1;y=0;
               // cout<<d<<" "<<x<<" "<<y<<endl;   //输出
        }
        else
        {
            gcd(b,a%b,d,y,x);
           // cout<<b<<" "<<a%b<<" "<<d<<" "<<y<<" "<<x<<endl; //输出
            y-=a/b*x;
           // cout<<x<<" "<<y<<endl;   //输出
        }
    }
    int main()
    {
        int a,b,d,x,y;
        while(cin>>a>>b)
        {
            gcd(a,b,d,x,y);
            if(d!=1) cout<<"sorry"<<endl;
            else
            {
                 while(x<0)       //x不能小于0
                    x+=b,y-=a;
                cout<<x<<" "<<y<<endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    RHCE
    Linux firewalld 防火墙
    ArcGIS案例学习笔记2_2
    HP LaserJet MFP M227_M231双面打印
    罗伯特•盖洛博士(Dr. Robert Charles Gallo)是世界著名的美国生物医学家,他以共同发现了人类免疫缺陷病毒(HIV)――这一导致获得性免疫缺陷综合症(AIDS)的致病源而闻名于世。
    砸向芯片科研的巨额经费去了哪儿?(转)
    tensorflow学习资料
    必备 .NET
    c# 7 vs2017 tuple
    ArcGIS 复制要素
  • 原文地址:https://www.cnblogs.com/hfc-xx/p/4737140.html
Copyright © 2011-2022 走看看