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

    #include<stdio.h>
    #define ll long long
    /* 2.那么x,y的一组解就是x1*m1,y1*m1,但是由于满足方程的解无穷多个,
    在实际的解题中一般都会去求解x或是y的最小正数的值。
    以求x为例,又该如何求解呢?还是从方程入手,
    现在的x,y已经满足a*x+b*y=m,那么a*(x+n*b)+b*(y-n*a)=m显然也是成立的。
    可以得出x+n*b(n=…,-2,-1,0,1,2,…)就是方程的所有x解的集合,
    由于每一个x都肯定有一个y和其对应,所以在求解x的时候可以不考虑y的取值。
    取k使得x+k*b>0,x的最小正数值就应该是(x+k*b)%b,但是这个值真的是最小的吗??
    如果我们将方程最有两边同时除以gcd(a,b),则方程变为a1*x+b1*y=m1,
    同上面的分析可知,此时的最小值应该为(x+k*b1)%b1,由于b1<=b,所以这个值一定会小于等于之前的值。
    在实际的求解过程中一般都是用while(x<0)x+=b1来使得为正的条件满足,为了更快的退出循环,
    可以将b1改为b(b是b1的倍数),并将b乘以一个倍数后再加到x上。*/
    ll x,y,q;
    void extgcd(ll a,ll b) {
    if(b==0) {
        x=1;y=0;q=a;
        return ;
    }
    extgcd(b,a%b);
    ll temp=x;
    x=y;y=temp-a/b*y;
    return ;
    }
    int main() {
      ll n,t,b,k;
      scanf("%I64d",&t);
      while(t--) {
        scanf("%I64d%I64d",&n,&b);
        extgcd(b,9973);
        x=x*n/q;//
        k=9973/q;//
        x=(x%k+k)%k;//求最小的x
        printf("%I64d
    ",x%9973);
      }
    return 0;
    }
    

  • 相关阅读:
    UML 类之间的关系
    [noi.ac省选模拟赛]第11场题解集合
    [CF1270F]Awesome Substrings
    [noi.ac省选模拟赛20200606]赌怪
    FFT,NTT入门
    [AHOI2017/HNOI2017]单旋
    [HNOI2016]最小公倍数
    [HNOI2016]树
    [HNOI2016]大数
    服务外包概论课程资料
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410702.html
Copyright © 2011-2022 走看看