• hdu 1573 A/B (扩展欧几里得)


    Problem Description

    要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973)= 1)。

     

     

    Input

    数据的第一行是一个T,表示有T组数据。
    每组数据有两个数n(0 <= n < 9973)和B(1<= B <= 10^9)。

     

     

    Output

    对应每组数据输出(A/B)%9973。

     

     

    Sample Input

    2

    1000 53

    87 123456789

     

     

    Sample Output

    7922

    6060

     /*************************

    欧几里得算法,又称辗转相除法,用于求最大公约数:  c = gcd(a,b) = gcd(b,a%b);

    扩展欧几里得算法:

    若a,b不全为0,则存在x,y使得 c = gcd(a,b) = a*x+b*y;   

    因为 gcd(a,b) = gcd(b,a%b),则有 x*a + y * b = x1 * b + y1 * (a%b),等式右边变形,则得到:b * x1 + (a%b) * y1 = b * x1+(a-a/b*b) * y1 = a * y1+b * (x1 - ( a / b) * y1)。

    则  x = y1 , y= x1-(a/b)*y1,然后可由后向前迭代得到 x,y。

      

    1573 A/B:

     A%B = 0 可令 x = A / B -> A = B*x;

    n = A % 9973 = A - A / 9973 * 9973 : 

     = B*x - A/9973*9973

     = n

    可以 令 y = A / 9973;  则 B * x + y * 9973 = n;    

    因为 gcd(9973,B) = 1,所以不能用exgcd(B,9973,x,y);

    B * x1 + 9973 * y1 = 1; -> B * x1 *n + 9973 * y1 * n = n;

    红色字体的两个式子比较系数就可以看出 x = x1 * n;

    然后求 x % 9973 就OK 了

    代码:

    #include <iostream>
    using namespace std;
    int exgcd(int a,int b,int &x,int &y)//  扩展欧几里得函数模板
    {
        if(b==0)
        {
            x = 1;y = 0;return a;
        }
        int d = exgcd(b,a%b,x,y);
        int t = x;
        x = y;
        y = t-a/b*y;
        return d;
    }
    
    int main()
    {
        int t,n,B,x,y,ans,xx;
        cin>>t;
        while(t--)
        {
            cin>>n>>B;
            ans = exgcd(B,9973,x,y);
            xx = x*n;
            ans = (xx%9973+9973)%9973;  // 防止 x 为负数
            cout<<ans<<endl;
        }
    }
    




      

  • 相关阅读:
    hadoop2 作业执行过程之reduce过程
    hadoop2 作业执行过程之map过程
    hadoop2 作业执行过程之yarn调度执行
    scala的下划线
    tomcat 配置系列1
    Windows Server 2008 __ Windows Server 2008R2
    dell技术中心
    戴尔服务器启动和raid设置(以dell r420为例)
    WinPE安装windows(dell r420)
    Red Hat enterprise linux 5.4 x64 + DELL R420 安装网卡驱动 (broadcom 5270)
  • 原文地址:https://www.cnblogs.com/gray1566/p/3704315.html
Copyright © 2020-2023  润新知