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

    ^^^转载请注明出处,谢谢合作O(∩_∩)O~

    A/B 扩展欧几里得算法

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)


    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
     解:
    因为A%9973=n,所以令A=n+9973*y;再设A/B=x,则得到B*x-9973*Y=n;因为gcd(B,9973)=1;所以B,9973互质,所以用扩展欧几里得算法(模板)即可;
    __int64 Extended_Euclid(__int64 a,__int64 b,__int64& x,__int64& Y)
    {
        if(b==0)
        {
            x=1;
            y=0;
            return a;
        }
        __int64 r=Extended_Euclid(b,a%b,x,y)
        __int64 temp=x;x=y;y=t-a/b*y;
        return r; //r为a,b的最大公约数
    }
    注意该模板只能在C++ 中使用,因为模板中使用了引用‘&’;
     

    (注意:__ int64(两个下划线):标准的64位int型           _int64(一个下划线):VC++里面的)

    扩展欧几里德算法:
      扩展欧几里德算法是用来在已知的非负整数(否则需要将式子变形,如求5x-13y=1的解则变形为5x+(-13y)=1,然后再对结果做处理即可a, b求解一组x,y使得ax+by = Gcd(a, b) =d(解一定存在,根据数论中的相关定理)扩展欧几里德常用在求解模线性方程及方程组中。

    下面是一个使用C++的实现:
      int exGcd(int a, int b, int &x, int &y)
      {
      if(b == 0)
      {
      x = 1;
      y = 0;
      return a; ---很难找出一个这么实现的价值,因为扩展欧几里得还有更大的用途;个人认为定义全局数组更好,不用return r。
      }
      int r = exGcd(b, a % b, x, y);
      int t = x;
      x = y;
      y = t - a / b * y;
      return r;
      }
    使用扩展欧几里德算法解决不定方程的办法:
      对于不定整数方程pa+qb=c,若 c mod Gcd(a, b)=0,则该方程存在整数解,否则不存在整数解。
      上面已经列出找一个整数解的方法,在找到p * a+q * b = Gcd(a, b)的一组解p0,q0后,可以证明p0为0附近的最小解,*p * a+q * b = Gcd(a, b)的其他整数解满足:
      p = p0 + b/Gcd(a, b) * t
      q = q0 - a/Gcd(a, b) * t(其中t为任意整数,p,q中的t相同)
      至于pa+qb=c的整数解,只需将p * a+q * b = Gcd(a, b)的每个解乘上 c/Gcd(a, b) 即可
      在找到p * a+q * b = Gcd(a, b)的一组解p0,q0后,应该是
      得到p * a+q * b = c的一组解p1 = p0*(c/Gcd(a,b)),q1 = q0*(c/Gcd(a,b)),p * a+q * b = c的其他整数解满足:
      p = p1 + b/Gcd(a, b) * t
      q = q1 - a/Gcd(a, b) * t(其中t为任意整数,p,q中的t相同)
      p 、q就是p * a+q * b = c的所有整数解。

     

    更多参考:
    代码:
    // Note:Your choice is C++ IDE
    #include <iostream>
    using namespace std;
    #define k 9973
    int uex(int a,int b,int &x,int &y)
    {
    int r;
    int t;
    if(b==0)
    {
    x=1;
    y=0;
    return a;
    }
    r=uex(b,a%b,x,y);
    t=x;
    x=y;
    y=t-a/b*y;
    return r;
    }
    int main()
    {
    int T,t,n,b,x,y;
    scanf("%d",&T);
    while(T--)
    {
    scanf("%d%d",&n,&b);
    uex(b,k,x,y);
    x*=n;
    if(x<0)
    {
    t=-x;
    t=t%k;
    x=k-t; //或者不用t变量 直接x=k-(-x)%k;或者用while(x<0){x+=k/1;},不过不推荐使用,因为可能会超时!最好用 x=(x%k+k)%k即可,if语句也不用了;
    }
    printf("%d\n",x%k);
    }
    return 0;
    }
  • 相关阅读:
    MVC实战之排球计分(六)—— 使用EF框架,创建Controller,生成数据库。
    MVC实战之排球计分(五)—— Controller的设计与实现
    MVC实战之排球计分(四)—— View设计与实现
    MVC实战之排球计分(三)—— 模型类的设计与实现
    MVC实战之排球计分(二)—— 构架概要设计
    MVC实战之排球计分(一)—— 需求分析与数据库设计
    连接虚机中的mysql服务
    mongodb3集群搭建
    spring-data-redis配制
    redis4集群
  • 原文地址:https://www.cnblogs.com/hsqdboke/p/2438270.html
Copyright © 2011-2022 走看看