poj 1061 青蛙的约会

 
<span style="font-size:12px;">这是一道数论的问题。主要用到欧几里德算法的扩展,下面是欧几里德算法拓展的应用中的三条定理</span>

定理一:如果d = gcd(a, b),则必能找到正的或负的整数k和l,使d = a*x+ b*y。

定理二:若gcd(a, b) = 1,则方程ax ≡ c (mod b)在[0, b-1]上有唯一解。

定理三:若gcd(a, b) = d,则方程ax ≡ c (mod b)在[0, b/d - 1]上有唯一解。

题意是:有两个青蛙要约会见面,它们在同一条纬度上,它们跳一次所用的时间也是相同的我们设其为t,则x+mt是青蛙A从坐标原点到终点所走的距离,y+nt是B走的距离,要想碰面,则他们相减一定是地面周长的整数倍,设为k*L;则:(x+mt)-(y+nt)=kl;变形得:(m-n)t-(y-x)=kL;即有(m-n)t mod L=y-x;为线性同余方程。此方程有解当且仅当y-xm-nL的最大公约数(记为gcd(m-n,L)),gcd(m-n,L)|y-x。这时,如果x0是方程的一个解,即当t=x0时,(m-n)t mod L=y-x成立,那么所有的解可以表示为:
{x0+k(L/gcd(m-n,L))|(k∈整数)}

下面是欧几里得的模板

int exGcd(int a, int b, int &x, int &y)
{
if(b == 0)
{
       x = 1;
       y = 0;
       return a;
}
int r = exGcd(b, a % b, x, y);
int t = x;
x = y;
y = t - a / b * y;
    return r;
}
 

 

 

 

 

 

 

 

本题的代码

#include<stdio.h>
__int64 exgcd(__int64 a, __int64 b,  __int64 &x,  __int64 &y)
{
	__int64 r, t;
	if(b==0)
	{
		x=1;
		y=0;
		return a;
	}
	r=exgcd(b,a%b,x,y);
	t=x;
	x=y;
	y=t-a/b*y;
	return r;
}
int main()
{
	__int64 x,y,m,n,l,xx,yy,d,r;
	scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&l);
	d=exgcd(n-m,l,xx,yy);
	if((x-y)%d!=0)
		printf("Impossible\n");
	else
	{
		xx=xx*((x-y)/d);
		r=l/d;
		xx=(xx%r+r)%r;
		printf("%Id\n",xx);
	}
	return 0;
}


 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值