zoukankan      html  css  js  c++  java
  • codeforces-787a

    https://vjudge.net/problem/709847/origin

    拓展欧几里德:a*x+b=c*y+d; -> a*x+c*y=d-b;

    代码:

    #include<bits/stdc++.h>
    using namespace std;

    #define ll long long

    ll exgcd(ll a,ll b,ll &x,ll &y){
        if(b==0){
            x=1;
            y=0;
            return a;
        }
        ll d=exgcd(b,a%b,x,y);
        ll tmp=x;
        x=y;
        y=tmp-a/b*y;
        return d;
    }

    int main(){
        ll a,b,C,D,x,y;
        while(cin>>a>>b>>C>>D){
            if(b<D){//若b<D,那么y<0,
                //原方程式等价于y=(a*x+b-d)/c,
                //下面的处理可保证x不小于0,但是不能保证y,
                //所以需要保证(a*x+b-d)%c==0,即:保证:b>D;若不成立需交换;
                swap(a,C);
                swap(b,D);
            }
            ll d = exgcd(a,C,x,y);
            ll c = D-b;
            if(c%d)  cout<<"-1"<<endl;
            else{
                x=x*(c/d);
                x=(x%(C/d)+(C/d))%(C/d);
                cout<<b+a*x<<endl;
            }
        }
        return 0;
    }

  • 相关阅读:
    设计模式(23)>解释器模式 小强斋
    设计模式(21)>享元模式 小强斋
    访问者模式与双分派 小强斋
    将BMP格式的灰度图像或24位真彩图像二值化
    如何使用自定义Title
    ACM. Digital Roots
    jpegEncode
    ACM.Ones
    剩余定理
    ACM.DNA Sorting
  • 原文地址:https://www.cnblogs.com/sunowsir/p/6896863.html
Copyright © 2011-2022 走看看