poj 2142

欧几里得。

代码:

#include<iostream>
#include<fstream>
#include<cmath>

using namespace std;

long long x,y;
long long egcd(long long s,long long t){
	if(t==0)
	{
		x=1;
		y=0;
		return s;
	}
	long long i=egcd(t,s%t);
	long long temp=x;
	x=y;
	y=temp-s/t*y;
	return i;
}

long long abs(long long s){
	if(s<0) return -s;
	else return s;
}

void read(){
	long long i,j,k,a,b,d,t1,t2,f;
//	ifstream cin("in.txt");

	while(cin>>a>>b>>d){
		if(a==0&&b==0&&d==0) return ;
		f=0;
		if(a<b)
		{
			f=1;swap(a,b);
		}
		i=egcd(a,b);
		y=y*d/i%a+a;
		y=y%(a/i);
		x=(d-b*y)/a;
		t1=y*i/a;
		t2=t1+1;
		if(abs(x+t1*b/i)+abs(y-t1*a/i)<abs(x+t2*b/i)+abs(y-t2*a/i))
		{
			if(f==0)
			cout<<abs(x+t1*b/i)<<' '<<abs(y-t1*a/i)<<endl;
			else
				cout<<abs(y-t1*a/i)<<' '<<abs(x+t1*b/i)<<endl;

			
		}
		else
			if(abs(x+t1*b/i)+abs(y-t1*a/i)>abs(x+t2*b/i)+abs(y-t2*a/i))
			{
				if(f==0)
				cout<<abs(x+t2*b/i)<<' '<<abs(y-t2*a/i)<<endl;
				else
					cout<<abs(y-t2*a/i)<<' '<<abs(x+t2*b/i)<<endl;

			}
			else
			{
				if(a*abs(x+t1*b/i)+b*abs(y-t1*a/i)<a*abs(x+t2*b/i)+b*abs(y-t2*a/i))
				{
					if(f==0)
					cout<<abs(x+t1*b/i)<<' '<<abs(y-t1*a/i)<<endl;
					else
						cout<<abs(y-t1*a/i)<<' '<<abs(x+t1*b/i)<<endl;

					
				}
				else
				{
					if(f==0)
					cout<<abs(x+t2*b/i)<<' '<<abs(y-t2*a/i)<<endl;
					else
						cout<<abs(y-t2*a/i)<<' '<<abs(x+t2*b/i)<<endl;
				}
			}
	}
}


int main(){
	read();
	return 0;
}

posted on 2011-04-06 15:49  宇宙吾心  阅读(571)  评论(0)    收藏  举报

导航