poj-1061

3 篇文章 0 订阅
首先理解题意:两只青蛙必须在同一时刻跳到同一位置,才有可能见面,我们可以将首尾相连的经度圈围成一个圈,我们以第一组测试数据为例,给出下面的图片:那么怎样才可以得到它的数学模型呢?
   从网上搜到的资料:(x+t*m)-(y+t*n)=l*C;其中x,y,m,n是题目中的意义,t跳的次数,l是圈数,C是周长,想想也有道理,我觉得谁减谁都可以,接下来整理得:(n-m)*t+l*c=x-y;令a=m-n,b=l,c=gcd(a,b),d=x-y,
即a*t+b*c=d(1);
  欧几里得算法 具体过程及其证明求其中t的最小整数解,利用扩展欧几里得算法我们可以求出其中一组解t0,c0,并令
c=gcd(a,b),a*t0+b*c0=c (2)
因为c=gcd(a,b),所以a*t/c是整数,b*t/c是整数,那么d/c也须为整数,否则无解.
(2)两边同时*d/c,得
a*t0*(d/c)+b*p0*(d/c)=d;即t0*(d/c)就是最小的整数解,但有可能是负数,如下变形:a*(t0*(d/c)+b*n)+b*(p0*(d/c)-a*n)=d,
接下来就是(t0*(d/c)%b+b)%b就是想要的结果(我现在也不是很明白):
再就是扩展欧几里得算法的推导过程(待续)
#include <iostream>
#include <cstdio>
using namespace std;
long long x0,y0,q;
long long  ex_eulid(long long  a,long long  b)
{


	if(b==0)
	{
		x0=1;y0=0;q=a;//q就是那个gcd(a,b);不能返回值,函数中的这些数据都是有
		            //用的

	}
	else
	{

		ex_eulid(b,a%b);
		long long  tmp=x0;
		x0=y0;
		y0=tmp-a/b*y0;//为什么呢??这些x,y,q就是扩展欧几里得的结果


	}
}
int main()
{

	long long v,x,y,n,m,l;
	int ok=0;
	long long  a,b,c,d;
//	cin>>a>>b;
	cin>>x>>y>>n>>m>>l;
	if(n==m)
	{
		ok=1;
		//break;
	}
	else
	{
	a=m-n;b=l;
	//c=q;
	d=x-y;
    ex_eulid(a,b);
	if(d%q!=0)
		ok=1;
	}
	  if(ok)
	  {
	  	  printf("Impossible\n");
		 // break;
	  }
	else
	{

		b=b/(q);
		d=d/(q);
		v=d*(x0);
	
	cout<<(v%b+b)%b<<endl;
	}
	return 0;


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值