1. 程式人生 > >POJ 2142 The Balance 擴展歐幾裏得

POJ 2142 The Balance 擴展歐幾裏得

mat while mes cstring pre 利用 urn map type

http://poj.org/problem?id=2142

題意:給出a,b,d<=5e5,問滿足x,y>=0,ax+by=d && |x|+|y| 盡量小
x,y都為正表示 a,b在c的另外一邊.x,y一正一負表示a,b不在同一邊

利用exgcd 求出x,y 另x或者y為最小正整數解,帶入方程後求出另一個解,取abs(若為負代表不在同一邊)即可

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <cstdio>
#include <map>
#include <vector>
using namespace std;
typedef long long ll;
const int N=1e3+20;
const int inf=2e8;
int a,b,d;
int x,y;
int gcd(int a,int b)
{
	if(b==0)
	{
		x=1,y=0;
		return a;
	}
	ll D=gcd(b,a%b);	
	ll t=y;
	y=x-a/b*y;
	x=t;
	return D;
}
 
int main()
{
	while(cin>>a>>b>>d&&(a+b+d))
	{
		int x1,y1;
		int D=gcd(a,b);
		x=x*d/D;
		int t=b/D;
		//通解 x=x0+t1*i, x帶回ax+by=c 求出y 
		x=(x%t+t)%t;//ax+by=c x在左邊 
		y=abs((d-a*x)/b);

		x1=x,y1=y;
		D=gcd(b,a);
		x=x*d/D;
		t=a/D;
		x=(x%t+t)%t;
		y=abs((d-b*x)/a);
		
		if(x1+y1<x+y)
			cout<<x1<<‘ ‘<<y1<<endl;
		else
			cout<<y<<‘ ‘<<x<<endl;
	}	
	return 0;
}

  

POJ 2142 The Balance 擴展歐幾裏得