• poj1061青蛙的约会 (扩展欧几里德)


    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

    题意:给你两个青蛙的坐标x1,y1,以及它们每次能跳的距离m,n,它们绕着长为l的圈子同方向跳跃,问最少跳几次它们能够碰面。

    思路:要使得它们在一个地方碰面,那么必须满足(x1+m*t)=(y1+n*t)mod l,变形后为(m-n)*t+l*(-k)=y1-x1,这里如果m<n,那么要把m,n;x,y;相互交换。变形后的式子就是一个普通的模线性方程了。

    有一个结论:方程ax=b(mod n)有解(即存在d|b,其中d=gcd(a,n)),x0=x*(b/d)%n+n是该方程的任意一个解,也是最小非负整数解,则该方程对模n恰有d个不同的解,分别为 xi=x0+i*(n/d)(i=0,1,...d-1).方程ax=b(mod n)对模n的最小非负整数解为x0 ,最大整数解x2=x0+(d-1)*(n/d)。


    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    #include<stack>
    #include<string>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    typedef long double ldb;
    #define inf 99999999
    #define pi acos(-1.0)
    
    ll extend_gcd(ll a,ll b,ll &x,ll &y){
        if(b==0){
            x=1;y=0;return a;
        }
        ll d=extend_gcd(b,a%b,y,x);
        y-=a/b*x;
        return d;
    }
    
    int main()
    {
        ll x,y,n,m,l,x1,y1,i;
        while(scanf("%lld%lld%lld%lld%lld",&x1,&y1,&m,&n,&l)!=EOF)
        {
            if(m<n){
                swap(m,n);
                swap(x1,y1);
            }
            ll dis=y1-x1;
            ll d=extend_gcd(m-n,l,x,y);
            if(dis%d!=0){
                printf("Impossible
    ");continue;
            }
            x=x*dis/d;
            ll r=l/d;
            x=(x%r+r)%r;//求出最小非负整数解
            printf("%I64d
    ",x);
        }
        return 0;
    }
    


  • 相关阅读:
    玩转Redis之Window安装使用(干货)
    如何用AJax提交name[]数组?
    Java中native关键字使用
    Kafka — 高吞吐量的分布式发布订阅消息系统【转】
    Permission denied: user=dr.who, access=READ_EXECUTE, inode="/tmp":student:supergroup:drwx------权限问题
    hdfs中删除文件、文件夹、抓取内容
    1. hadoop使用启动命令时报错之分析解决
    第三次迭代会议
    IAR Embedded Workbench for ARM 8.22.1 基础使用教程
    个人作业1——四则运算题目生成程序(基于java)
  • 原文地址:https://www.cnblogs.com/herumw/p/9464540.html
Copyright © 2020-2023  润新知