/*
求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;
}
POJ 2142 (二元同余方程)
最新推荐文章于 2023-03-05 01:07:59 发布