zoukankan      html  css  js  c++  java
  • 扩展欧几里得及其应用

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576

    详细扩展欧几里德算法介绍,参见点击打开链接点击打开链接

    解决该题的关键是:

    1、了解扩展欧几里德算法,可以运用其解出gcd(a,b)=ax1+by1中的x1、y1的值

    2、由题可得以下内容:

    n=A%9973,则n=A-A/9973*9973。又A/B=x,则A=Bx。所以Bx-A/9973*9973=n。即Bx-9973y=n。

    到这里我们可以发现:只要求出x的值,即可算出x%9973,也就是(A/B)%9973了。顺利解决了!

    3、题目关键转到如何求出x了。题目的输入是n和B,利用扩展欧几里德算法可求出gcd(B,9973)=Bx1+9973y1=1的x1。

    等式两边同乘以n,得B(nx1)-9973(-ny1)=n。可知nx1就是Bx-9973y=n的解了!!!即x=nx1。

    4、对于第三部得到的x可能是负数,由题这显然是不正确的。

    可以做这样的转化:(x%9973+9973)%9973

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #define mod 9973
    using namespace std;
    void extern_gcd(int a,int b,int &x,int &y)
    {
        if(b==0)
        {
            x=1;
            y=0;
            return;
        }
        else
        {
            extern_gcd(b,a%b,x,y);
            int r=x;
            x=y;
            y=r-a/b*y;
        }
    }
    int main()
    {
        int t,x,y;
        cin>>t;
        while(t--)
        {
            int n,B;
            cin>>n>>B;
            extern_gcd(B,9973,x,y);
            x*=n;
            cout<<(x%9973+9973)%9973<<endl;
        }
        return 0;
    }
    



  • 相关阅读:
    HyperLeger Fabric开发(三)——HyperLeger Fabric架构
    WPF设计の画刷(Brush)
    WPF设计の画刷(Brush)
    WPF设计の画刷(Brush)
    Mina Basics 02-基础
    内置方法
    py-opp 类(class)
    Python 学习目录
    py-函数进阶
    py-函数基础
  • 原文地址:https://www.cnblogs.com/wolf940509/p/6617105.html
Copyright © 2011-2022 走看看