POJ 2142 (二元同余方程)

/*

求x,y的最小的,利用拓展欧几里得算法先求出x,y
算的x,即为最小的x
再算y,x;
算出的y,即为最小
然后分别相加,求出最小的。

*/

#include<iostream>
#include<cmath>

using namespace std;

typedef long long ll;

int exgcd(int a,int b,int& x,int& y)
{
    if(b==0){
        x=1,y=0;
        return a;
    }
    int r,tx,ty;
    r=exgcd(b,a%b,tx,ty);
    x=ty;
    y=tx-a/b*ty;
    return r;
}

void work(int a,int b,int d,int &x,int &y)
{
    int g=exgcd(a,b,x,y);
    x*=d/g;
    int t=b/g;
    x=(x%t+t)%t;
    y=abs(d-a*x)/b;
}

int main()
{
    int a,b,d,x1,y1,x2,y2;
    while(cin>>a>>b>>d){
        if(!(a+b+d))
            break;
        work(a,b,d,x1,y1);
        work(b,a,d,y2,x2);
        if(x1+y1<x2+y2)
            cout<<x1<<" "<<y1<<endl;
        else
            cout<<x2<<" "<<y2<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40679299/article/details/80343739