poj 1061 개구리 의 데이트(유클리드 확장)

http://poj.org/problem?id=1061
사고:그들 이 t 번 뛰 어 만 났 다 고 설정 하면(x+t*m)-(y+t*n)=z*l(z 는 하나의 정수 로 그들의 거리 차 이 는 l 의 z 배 임 을 나타 낸다)변형 되 었 다.
(n-m)*t + z*l = (x-y);
n-m;b = l; c = x-y;
그러면 원 식 은 a*t+z*b=c 로 변 합 니 다.
유클리드 템 플 릿 을 확장 하고 a*x+b*y=gcd(a,b)방정식 과 같은 구 해 형 을 구 합 니 다.
LL extend_gcd(LL a, LL b, LL &x, LL &y)
{
	if(b == 0)
	{
		x = 1;
		y = 0;
		return a;
	}

	LL d = extend_gcd(b,a%b,x,y);
	LL t = x;
	x = y;
	y = t-a/b*y;
	return d;
}

방정식 a*x+b*y=c 가 풀 리 는 전 제 는 gcd(a,b)|c 이 고 이 를 바탕 으로 방정식 은 d=gcd(a,b)의 서로 다른 풀이 가 있다.그 중에서 기초 해 x0=x'*(c/d)%b(그 중 x'는 a*x'+b*y'=gcd(a,b)의 해);xi=x0+i*(b/d)로 통칭 합 니 다.
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define LL long long
#define _LL __int64
#define eps 1e-8

using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 10;



LL extend_gcd(LL a, LL b, LL &x, LL &y)
{
	if(b == 0)
	{
		x = 1;
		y = 0;
		return a;
	}

	LL d = extend_gcd(b,a%b,x,y);
	LL t = x;
	x = y;
	y = t-a/b*y;
	return d;
}

int main()
{
	LL x,y,m,n,l;
	LL a,b,c,d;
	while(~scanf("%lld %lld %lld %lld %lld",&x,&y,&m,&n,&l))
	{
		a = n-m;
		b = l;
		c = x-y;

		LL t,z;
		d = extend_gcd(a,b,t,z);
		if(c%d != 0)
		{
			printf("Impossible
"); continue; } t = t*(c/d); t = (t%b+b)%b; printf("%lld
",t); } return 0; }

좋은 웹페이지 즐겨찾기