poj 1061 青蛙的约会

这道题是比较经典的欧几里得扩展的题目。
通过从题目的意思得到一个等式,再通过一些操作,使之化成ax+by=tgcd(a+b)的式子,求出x再乘上t即可。

因为ax+by=gcd 是必有解的。




#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long int gcd(long long int a,long long int b)
{
	return b==0? a:gcd(b,a%b);
}
void ex(long long int a,long long int b,long long int &x,long long int &y,long long int &d)
{
	if(b==0){
		d=x;
		x=1;y=0;
	}
	else {
		ex(b,a%b,y,x,d);
		y-=x*(a/b);
	}
}
int main(){
	long long int x1,y1,m,n,l; 
	while(cin>>x1>>y1>>m>>n>>l)
	{
	

	   	 long long int t=x1-y1;
	   	 long long int gc=gcd(n-m,l);
	   	 if(t%gc!=0)
	   	 {
	   	 	cout<<"Impossible"<<endl;
			}
		else {
			long long int a=n-m,b=l,x,y,d;
			ex(a,b,x,y,d);
			x=((x*t/gc)%l+l)%l;
			if(x==0)x+=l;
		    cout<<x<<endl;
		}
		
	}
	return 0;
}
//欧几里得扩展 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值