青蛙的约会
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 105587   Accepted: 20789

Description

两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面。 
我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。 

Input

输入只包括一行5个整数x,y,m,n,L,其中x≠y < 2000000000,0 < m、n < 2000000000,0 < L < 2100000000。

Output

输出碰面所需要的跳跃次数,如果永远不可能碰面则输出一行"Impossible"

Sample Input

1 2 3 4 5

Sample Output

4
扩展欧几里得求不定方程:ax+by=gcd(a,b)的解.不定方程 ax+by=c。若gcd(a,b)不能整除c,那么不定方程无解。
代码一:
#include <cstdio>
using namespace std;
typedef long long LL;
LL extgcd(LL a,LL b,LL &x,LL &y)
{
LL d=a;
if(b!=)
{
d=extgcd(b,a%b,y,x);
y-=(a/b*x);
}
else
{
x=;y=;
}
return d;
}
LL s1,s2,v1,v2,l;
int main()
{
while(scanf("%lld%lld%lld%lld%lld",&s1,&s2,&v1,&v2,&l)!=EOF)
{
LL a,b,c,x,y;
a=v1-v2;
b=l;
c=s2-s1;
if(a<) a+=l;
LL gcd=extgcd(a,b,x,y);
if(c%gcd!=)
{
printf("Impossible\n");
}
else
{
LL mod=b/gcd;
x=(x*(c/gcd))%mod;//注意扩大 c/gcd 倍
while(x<) x+=mod;
printf("%lld\n",x);
}
}
return ;
}

代码二:

#include <iostream>
using namespace std;
typedef __int64 LL;//int前双'_'
LL extgcd(LL a,LL b,LL &x,LL &y)
{
LL d=a;
if(b!=)
{
d=extgcd(b,a%b,y,x);
y-=(a/b*x);
}
else
{
x=;y=;
}
return d;
}
LL gcd(LL a,LL b)
{
if(b==) return a;
else return gcd(b,a%b);
}
LL s1,s2,v1,v2,m;
int main()
{
while(cin>>s1>>s2>>v1>>v2>>m)
{
//两者相遇的条件 s1+v1*t=s2+v2*t-k*m => (v1-v2)*t+m*k=s2-s1
//得线性同余方程 ax+by=c (a:v1-v2,x:t,b:m,k:y,c:s1-s1)
LL a=v1-v2;
if(a<) a+=m;
LL b=m;
LL c=s2-s1;
if(c<) c+=m;
LL div=gcd(a,b);
if(c%div!=) //同余方程ax+by=c.有解的充要条件是 c|gcd(a,b).
{
cout<<"Impossible"<<endl;
continue;
}
a/=div;//将各个系数均缩小div倍
b/=div;//ax+by=c => a'x+b'y=c'
c/=div;
LL x=,y=;
extgcd(a,b,x,y);//求解线性同余方程 ax+by=1
x=(x*c)%b;//扩展欧几里得求的是ax+by=1中的x,结果需要将x扩大c倍
while(x<) x+=b;
cout<<x<<endl;
}
return ;
}

java版

import java.util.Scanner;
import static java.lang.System.out;
public class Main{
static Scanner in = new Scanner(System.in);
static long s1,s2,v1,v2,l;
static class LL{
private long value;
public LL(long value)
{
this.value=value;
}
public long getValue()
{
return this.value;
}
public void setValue(long value)
{
this.value=value;
}
}
static long extgcd(long a,long b,LL x,LL y)
{
long d=a;
if(b!=0)
{
d=extgcd(b,a%b,y,x);
long buf = y.getValue();
buf-=(a/b*x.getValue());
y.setValue(buf);
}
else
{
x.setValue(1);y.setValue(0);;
}
return d;
}
public static void main(String args[]){ while(in.hasNext())
{
s1=in.nextLong();
s2=in.nextLong();
v1=in.nextLong();
v2=in.nextLong();
l=in.nextLong();
long a=v1-v2,b=l,c=s2-s1;
if(a<0) a+=l;
LL x = new LL(0),y = new LL(0);
long div=extgcd(a,b,x,y);
if(c%div!=0)
{
out.println("Impossible");
continue;
}
long mod=b/div;
long res=x.getValue();
res=(res*(c/div))%mod;//最小正整数解
while(res<0)
res+=mod;
out.println(res);
}
}
}

POJ1061(线性同余方程)的更多相关文章

  1. POJ1061 青蛙的约会(线性同余方程)

    线性同余方程$ ax \equiv b \pmod n$可以用扩展欧几里得算法求解. 这一题假设青蛙们跳t次后相遇,则可列方程: $$ Mt+X \equiv Nt+Y \pmod L$$ $$ (M ...

  2. 数论 - n元线性同余方程的解法

    note:n元线性同余方程因其编程的特殊性,一般在acm中用的很少,这里只是出于兴趣学了一下 n元线性同余方程的概念: 形如:(a1*x1+a2*x2+....+an*xn)%m=b%m       ...

  3. POJ2115 C Looooops(线性同余方程)

    无符号k位数溢出就相当于mod 2k,然后设循环x次A等于B,就可以列出方程: $$ Cx+A \equiv B \pmod {2^k} $$ $$ Cx \equiv B-A \pmod {2^k} ...

  4. POJ 2115 C Looooops (扩展欧几里德 + 线性同余方程)

    分析:这个题主要考察的是对线性同余方程的理解,根据题目中给出的a,b,c,d,不难的出这样的式子,(a+k*c) % (1<<d) = b; 题目要求我们在有解的情况下求出最小的解,我们转 ...

  5. poj2115-C Looooops -线性同余方程

    线性同余方程的模板题.和青蛙的约会一样. #include <cstdio> #include <cstring> #define LL long long using nam ...

  6. 扩展欧几里得,解线性同余方程 逆元 poj1845

    定理:对于任意整数a,b存在一堆整数x,y,满足ax+by=gcd(a,b) int exgcd(int a,int b,int &x,int &y){ ){x=,y=;return ...

  7. POJ 1061 - 青蛙的约会 - [exgcd求解一元线性同余方程]

    先上干货: 定理1: 如果d = gcd(a,b),则必能找到正的或负的整数k和l,使ax + by = d. (参考exgcd:http://www.cnblogs.com/dilthey/p/68 ...

  8. HDU3579:Hello Kiki(解一元线性同余方程组)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3579 题目解析:求一元线性同余方程组的最小解X,需要注意的是如果X等于0,需要加上方程组通解的整数区间lc ...

  9. HDU1573:X问题(解一元线性同余方程组)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1573 题目解析;HDU就是坑,就是因为n,m定义成了__int64就WAY,改成int就A了,无语. 这题 ...

随机推荐

  1. accept= 'image/*'反映缓慢

    input[type='file']的accept属性用来指定上传文件的MIME类型. 将其设为accept= 'image/*',顾名思义,过滤掉所有非图片文件, 但在实际操作中,发现有时会出现响应 ...

  2. 20145210姚思羽 《网络对抗技术》 Web安全基础实践

    20145210姚思羽 <网络对抗技术> Web安全基础实践 实验后回答问题 1.SQL注入攻击原理,如何防御 ·SQL攻击的原理很简单,就是在用户名输入框里输入SQL语句,来欺骗数据库服 ...

  3. 3.6《深入理解计算机系统》笔记(四)虚拟存储器,malloc,垃圾回收【插图】

    概述 ●我们电脑上运行的程序都是使用虚拟存储,跟物理内存根本不搭边. ●既然虚拟内存是在磁盘上的,为什么它又运行这么好,并没有感觉卡顿?这要感谢程序的局部性! ●虚拟存储器的调度是一个操作系统必须做好 ...

  4. C语言一个细节地方的说明【防止使用不当而出错】

    1.运行如下的代码: #include <stdio.h> #include <string.h> int main() { int a; a=1; int s[4]; mem ...

  5. inline-block和同级的text-align问题

    https://www.cnblogs.com/qjqcs/p/5551640.html margin:0 auto:是设置块标签在父级中居中对齐,是一种对齐方式.所以对于display:inline ...

  6. 【转】Vue.js:轻量高效的前端组件化方案

    摘要:Vue.js通过简洁的API提供高效的数据绑定和灵活的组件系统.在前端纷繁复杂的生态中,Vue.js有幸受到一定程度的关注,目前在GitHub上已经有5000+的star.本文将从各方面对Vue ...

  7. php提前输出响应及注意问题

    1.浏览器和服务器之间是通过HTTP进行通信的,浏览器发送请求给服务器,服务器处理完请求后,发送响应结果给浏览器,浏览器展示给用户.如果服务器处理请求时间比较长,那么浏览器就需要等待服务器的处理结果. ...

  8. ROS创建工作空间

    1.$mkdir catkin_ws && cd catkin_ws && mkdir src 2.$catkin_make   (#这一句是完成编译初始化,注意括号内 ...

  9. Struts2学习(2)

    1.结果嗯配置 (1)全局结果页面 (2)局部结果页面 (3)result标签type属性 2.在action获取表单提交数据 (1)使用ActionContext类获取 (2)使用ServletAc ...

  10. python基础4 - 判断(if)语句

    6. 判断(if)语句 6.1 if 判断语句基本语法 在 Python 中,if 语句 就是用来进行判断的,格式如下: if 要判断的条件: 条件成立时,要做的事情 …… 注意:代码的缩进为一个 t ...