zoukankan      html  css  js  c++  java
  • HDU 1576 A/B 扩展欧几里德算法

    A/B

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 2017    Accepted Submission(s): 1469


    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

    79226060

    解决该题的关键是:
    
    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<stdio.h>
    #include<iostream>
    using namespace std;
    int t,p;
    void extend_gcd(int a,int b)
    {
        if(b==0)
        {
            t=1;
            p=0;
        }
        else
        {
            extend_gcd(b,a%b);
            int temp=t;
            t=p;
            p=temp-a/b*p;
    
        }
    }
    int main()
    {
        int a;
        int n,b;
        scanf("%d",&a);
        while(a--)
        {
            scanf("%d%d",&n,&b);
            extend_gcd(b,9973);
            t=t*n;
            //while(p<=0)
               t=(9973+t%9973)%9973;//最小正整解
            printf("%d
    ",t);
    
        }
        return 0;
    }
    

    此题所实用long long型只是。仅仅能用int

  • 相关阅读:
    Max History CodeForces
    Buy a Ticket CodeForces
    AC日记——字符串的展开 openjudge 1.7 35
    AC日记——回文子串 openjudge 1.7 34
    AC日记——判断字符串是否为回文 openjudge 1.7 33
    AC日记——行程长度编码 openjudge 1.7 32
    AC日记——字符串P型编码 openjudge 1.7 31
    AC日记——字符环 openjudge 1.7 30
    AC日记——ISBN号码 openjudge 1.7 29
    AC日记——单词倒排 1.7 28
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5223674.html
Copyright © 2011-2022 走看看