poj 1061(扩展欧几里得)

青蛙的约会

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 90299   Accepted: 16412

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

Source

浙江

学完算法导论第三十一章再来做这个题目吧,so easy!!!

AC代码:

#include<iostream>
using namespace std;
#define LL long long
LL x,y,m,n,L;
LL ext_gcd(LL a,LL b,LL &x,LL &y){
    if(b==0){
        x=1;
        y=0;
        return a;
    }
    LL ret=ext_gcd(b,a%b,x,y);
    LL tmp=x;
    x=y;
    y=tmp-a/b*y;
    return ret;
}
int main(){
    LL k,t,d;
    cin>>x>>y>>m>>n>>L;
    d=ext_gcd(n-m,L,k,t);
    if((x-y)%d){
        cout<<"Impossible"<<endl;
    }
    else{
        LL ans=k*(x-y)/d;
        ans=(ans%(L/d)+L/d)%(L/d);
        cout<<ans<<endl;
    }
    return 0;
}

poj 1061(扩展欧几里得)

时间: 2024-10-24 11:38:59

poj 1061(扩展欧几里得)的相关文章

poj 2142 扩展欧几里得

原题实际上就是求方程a*x+b*y=d的一个特解,要求这个特解满足|x|+|y|最小 套模式+一点YY就行了 总结一下这类问题的解法: 对于方程ax+by=c 设tm=gcd(a,b) 先用扩展欧几里得求出方程ax+by=tm的解x0.y0 然后有a*x0+b*y0=tm 令x1=x0*(c/tm),y1=y0*(c/tm) 则a*x1+b*y1=c x1.y1即原方程的一个特解 这个方程的通解:xi=x1+k*(b/m),yi=y1-k*(a/m) 另:如果要求yi的最小非负解?令r=a/tm

The Balance POJ 2142 扩展欧几里得

Description Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a dose of medicine. For example, to measure 200mg of aspirin using 300mg weights and 700mg weights, she can put one 700mg weight on the side of the medicine an

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

原式 ax + by = c    =>  ax1 + by1 = gcd(a,b); a,b,c为任意整数,d = gcd(a,b),则  ax1 + by1 = d 的一组解是(x1,y1),c是gcd(a,b)的倍数时,其中的一组解为(x1*c/d,y1*c/d);c不是gcd(a,b)的倍数时,无解 青蛙的约会,就是一道例题 按照题意很容易列举出等式:(x+ms) - (y+ns) = k*l;  (k=1.....n)   变形到  扩展欧几里得公式  即可: #include <i

【POJ 1061】青蛙的约会(扩展欧几里得)

[POJ 1061]青蛙的约会(扩展欧几里得) Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 103473   Accepted: 20116 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它

扩展欧几里得求最小非负整数解 (POJ 1061 青蛙约会为例)

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

[ACM] POJ 1061青蛙的约会(扩展欧几里得求模线性方程)

青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 89206   Accepted: 15926 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能

扩展欧几里得定理——POJ 1061

对应POJ 题目:点击打开链接 青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 94409   Accepted: 17470 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得

POJ 1061 青蛙的约会 扩展欧几里得

扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long ll; ll exgcd(ll a, ll b, ll&x, ll&y) { if (b ==

poj 1061 同余方程+扩展欧几里得+(求最小非负整数解)

题目可以转化成求关于t的同余方程的最小非负数解: x+m*t≡y+n*t (mod L) 该方程又可以转化成: k*L+(n-m)*t=x-y 利用扩展欧几里得可以解决这个问题: eg:对于方程ax+by=c 设tm=gcd(a,b) 若c%tm!=0,则该方程无整数解. 否则,列出方程: a*x0+b*y0=tm 易用extend_gcd求出x0和y0 然后最终的解就是x=x0*(c/tm),y=y0*(c/tm) 注意:若是要求最小非负整数解? 例如求y的最小非负整数解, 令r=a/tm,则