青蛙的约会 POJ - 1061(拓展欧几里得、线性同余方程)

传送门

先来说题意,两个青蛙,绕着一个长为L的圈跑,青蛙A,B最开始分别位于x,y位置,他们每个单位时间分别可以跑m,n米,问他们是否可以相遇,如果可以相遇的话输出他们所用的最短时间。

假设他们一共跑了t时间,青蛙A,B的总路程分别为mt+x,nt+x,如果们可以相遇的话那么他们的差肯定为圈的长度L的n倍,就可以列出一个关于他们的方程

mt+x-nt-y=pL
变形得到
(m-n)t+pl=y-x

那么他们什么时候没有解呢???对于ax+by=c如果有解的话,c%gcd(a,b)==0;
然后通过拓展欧几里得求出来的x可能小于0,我们要把它转化成整数,代码中要判断一下k是不是大与0,如果小于零的话,取其相反数

#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<string>
#define lson l, mid, root << 1
#define rson mid + 1, r, root << 1 | 1
#define father  l , r , root
#define lowbit(x) ( x & ( - x ) )
#define mod 9973
#define ll long long
using namespace std;
const int maxn = 5e5+10;
const int inf = 0x3f3f3f3f;
ll x,y;
ll exgcd(ll a,ll b){
	if(b==0){
		x=1;
		y=0; 
		
		return a;
	}
	ll ans=exgcd(b,a%b);
	ll k=x;
	x=y;
	y=k-a/b*y;
	return ans;
}
int main()
{
	ll xx,yy,m,n,l;
	while(~scanf("%lld%lld%lld%lld%lld",&xx,&yy,&m,&n,&l)){
		ll g=exgcd(m-n,-l);
		ll c=yy-xx;
		if(c%g==0){
			ll k=l/g;
			ll ans=x*c/g;
			if(k<0)k=-k;
			ans=(ans%k+k)%k;
			printf("%lld\n",ans);
		}else{
			printf("Impossible\n");
		}
		
	}
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值