POJ 1061 青蛙约会(扩展欧几里德)

本文介绍了一个经典的青蛙约会问题,通过扩展欧几里德算法解决相遇次数的问题。文章详细阐述了解题思路,包括如何建立数学模型并求解方程。
#include <iostream>
#include <cstdio>  //VJ上用printf scanf要加上这个库
using namespace std;
long long gcd(long long a,long long b){  //欧几里德算法
	return b==0?a:gcd(b,a%b);
}
void exgcd(long long a,long long b,long long &d,long long &x,long long &y){  //扩展欧几里德算法
	if(!b) {
		d=a;
		x=1;
		y=0;
	}
	else{
		exgcd(b,a%b,d,y,x);
		y-=x*(a/b);
	}
} 
void jump(long long x,long long y,long long m,long long n,long long l){
	long long a=n-m;
	long long b=l;
	long long c=x-y;
	long long g=gcd(a,b);
	
	if(c%g){
		printf("%s\n","Impossible");
		return;	
	}
	

	long long x_=0,y_=0;
	
	exgcd(a,b,g,x_,y_);
	
	x_=x_*c/g;
	

	while(x_<0) x_+=b;
	
	x_%=b;  //取最小值的话必须要取模
	printf("%lld\n",x_);
	
	
}

int main(){
	long long x,y,m,n,l;
	while(~scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l))
		jump(x,y,m,n,l);
}

经典的青蛙约会问题,主要是扩展欧几里德算法的运用。

根据题意列出方程,设青蛙跳p次相遇,总路程总共走了q圈;

x+mp-(y+np)=ql

整理得 p(n-m)+ql=x-y

令a=n-m b=l c=x-y x=p y=q

得 ax+by=c;

如果c和gcd(a,b)无关 则该方程无解(我这里也没有完全理解)

如果c和gcd(a,b)有关 我们求解ax+by=gcd(a,b) 然后将结果*c/gcd(a,b)就能得到结果;

当结果为负时加上b,同时为了取得最小值所以取模(不知道为什么要取模)

最后的x就是我们要求的相遇跳的次数了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值