poj 1061(线性同余)

青蛙的约会

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 104278   Accepted: 20356

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

题解:设t次跳跃后想遇,我们可以列出如下式子(x + mt) % L = (y + nt) % L 然后通过化简我们可以得到如下方程 (n-m)*t+k*L = (x-y).然后我们发现这个式子就是扩展欧几里德,如果gcd(n-m,L)|(x-y)那么此式子有解,如果有解的话 设当前解为 X0,那么式子ax+by=c的通解为 {X0*c/gcd(a,b)+k*b/gcd(a,b)}(k属于整数)。此题的最小正整数解为 mod =b/gcd(a,b) t=t*(x-y)/gcd(n-m,L); t = (t%mod+mod)%mod.
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long LL;

LL extend_gcd(LL a,LL b,LL &x,LL &y){
    if(!b){
        x=1,y = 0;
        return a;
    }else{
        LL x1,y1;
        LL d = extend_gcd(b,a%b,x1,y1);
        x = y1;
        y = x1 - a/b*y1;
        return d;
    }
}
int main()
{
    LL x,y,m,n,L,t,k;
    scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&L);
    LL d = extend_gcd(n-m,L,t,k);
    if((x-y)%d!=0){
        printf("Impossible\n");
    }
    else{
        t = t*((x-y)/d);
        LL mod = L/d;
        printf("%lld\n",(t%mod+mod)%mod);
    }
    return 0;
}

				
时间: 2024-12-24 17:02:10

poj 1061(线性同余)的相关文章

POJ 3087 Shuffle&#39;m Up 线性同余,暴力 难度:2

http://poj.org/problem?id=3087 设:s1={A1,A2,A3,...Ac} s2={Ac+1,Ac+2,Ac+3,....A2c} 则 合在一起成为 Ac+1,A1,Ac+2,A2......A2c,Ac 经过一次转换之后变成 s1={Ac+1,A1,Ac+2.....} s2={...A2c,Ac} 对应之前,每个数的序号发生的变化是 +1,+2,+3....-c,-c+1,..... 把整个数链想成环,也相当于是: +1,+2,+3....+c,+c+1,...

POJ 1745 线性和差取余判断

POJ 1745 线性和差取余判断 题目大意:每个数都必须取到,相加或相减去,问所有的方案最后的得数中有没有一个方案可以整除k 这个题目的难点在于dp数组的安排上面 其实也就是手动模仿了一下 比如 一个数,不用说,第一个数之前不用加符号就是本身,那么本身直接对K取余, 那么取17的时候有个余数为2----基础然后来了一个5,(2 + 5)对7取余为0----层层延伸 (2 - 5)对7取余为4(将取余的负数变正) 那么前2个数有余数0和4再来一个-21(0+21)对7取余为0(0-21)对7取余

POJ - 1061 青蛙的约会 (扩展欧几里得算法)

Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 我们把这

poj 1061 青蛙的约会 (扩展欧几里得模板)

青蛙的约会 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1061 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很

poj 1061 青蛙的约会(拓展欧几里德)

Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 我们把这

一、解密随机数生成器(2)——从java源码看线性同余算法(转)

上篇博客中,我们了解了基于物理现象的真随机数生成器,然而,真随机数产生速度较慢,为了实际计算需要,计算机中的随机数都是由程序算法,也就是某些公式函数生成的,只不过对于同一随机种子与函数,得到的随机数列是一定的,因此得到的随机数可预测且有周期,不能算是真正的随机数,因此称为伪随机数(Pseudo Random Number). 不过,别看到伪字就瞧不起,这里面也是有学问的,看似几个简简单单的公式可能是前辈们努力了几代的成果,相关的研究可以写好几本书了!顺便提一下,亚裔唯一图灵奖得主姚期智,研究的就

数学#扩展欧几里德 POJ 1061&amp;2115&amp;2891

寒假做的题了,先贴那时写的代码. POJ 1061 #include<iostream> #include<cstdio> typedef long long LL; using namespace std; void extend_gcd(LL a,LL b,LL &d,LL &x,LL &y) { if(b==0) { d=a; x=1,y=0; } else { extend_gcd(b,a%b,d,y,x); y-=x*(a/b); } } int

解密随机数生成器(二)——从java源码看线性同余算法

Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术的3.2.1节) 如果两个Random实例使用相同的种子,并且调用同样的函数,那么生成的sequence是相同的 也可以调用Math.random()生成随机数 Random实例是线程安全的,但是并发使用Random实例会影响效率,可以考虑使用ThreadLocalRandom变量. Random实

线性同余系列

线形同余方程系列 求解形如 :  ax ≡ b (mod n) 方程可以变形为 : ax – ny = b; 对于这个方程的求解可以使用扩展欧几里得定理做,有解的首要条件便是 b 能够整除 gcd(a ,n); 证明如下: 如果b 不能够整除 (a ,n),那么方程两边同除以(a ,n),有 a’x – n’y = b/(a ,n) ; 可以看出,方程左边肯定是整数,右边却为小数,所以b肯定能整除 (a ,n); 对于方程: ax – ny = gcd(a ,n);通过扩展欧几里得可以求出方程的