• 一本通1631【例 1】青蛙的约会


    1631:【例 1】青蛙的约会

    时间限制: 1000 ms         内存限制: 524288 KB

    【题目描述】

    原题来自:POJ 1061

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

    我们把这两只青蛙分别叫做青蛙 A 和青蛙 B ,并且规定纬度线上东经 0 度处为原点,由东往西为正方向,单位长度 1 米,这样我们就得到了一条首尾相接的数轴。设青蛙 A 的出发点坐标是 x ,青蛙 B 的出发点坐标是 y。青蛙 A 一次能跳 m 米,青蛙 B 一次能跳 nn 米,两只青蛙跳一次所花费的时间相同。纬度线总长 L 米。现在要你求出它们跳了几次以后才会碰面。

    【输入】

    输入只包括一行 5 个整数 x,y,m,n,L 。

    【输出】

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

    【输入样例】

    1 2 3 4 5

    【输出样例】

    4

    【提示】

    数据范围与提示:

    对于 100% 的数据, 0≤x,y<2×109,0<m,n<2×109,0<L<2×109。 保证 xy

    sol:非常luo的模板。。。

    原式 x+T*m = y+T*n (%L)
    -->x-y = T*(n-m)+k*L
    -->T*(n-m)+k*L = x-y 类似(ax+by=c的形式)
    如果(x-y)%gcd(n-m,L)!=0无解

    列出数字直接用exgcd板子就好了

    之后要用通解公式 x=x1+b/r*t , y=y1-a/r*t 

    对于这个处理就是两句话

    ll tmp=b/r;
    X=(X>=0)?(X%tmp):(X%tmp+tmp);

    上代码

    /*
    原式 x+T*m = y+T*n  (%L)
      -->x-y = T*(n-m)+k*L
      -->T*(n-m)+k*L = x-y 类似(ax+by=c的形式)
      如果(x-y)%gcd(n-m,L)!=0无解
    */
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    inline ll read()
    {
        ll s=0;
        bool f=0;
        char ch=' ';
        while(!isdigit(ch))
        {
            f|=(ch=='-'); ch=getchar();
        }
        while(isdigit(ch))
        {
            s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
        }
        return (f)?(-s):(s);
    }
    #define R(x) x=read()
    inline void write(ll x)
    {
        if(x<0)
        {
            putchar('-'); x=-x;
        }
        if(x<10)
        {
            putchar(x+'0');    return;
        }
        write(x/10);
        putchar((x%10)+'0');
        return;
    }
    #define W(x) write(x),putchar(' ')
    #define Wl(x) write(x),putchar('
    ')
    ll x,y,m,n,L;
    inline ll gcd(ll x,ll y)
    {
        return (!y)?(x):(gcd(y,x%y));
    }
    //T*(n-m)+k*L = x-y
    inline void Exgcd(ll a,ll b,ll &X,ll &Y)
    {
        if(b==0)
        {
            X=1;
            Y=0;
            return;
        }
        Exgcd(b,a%b,X,Y);
        int XX=X,YY=Y;
        X=YY;
        Y=XX-a/b*YY;
        return;
    }
    int main()
    {
        ll a,b,c,r,X,Y;
        R(x); R(y); R(m); R(n); R(L);
        a=n-m;
        b=L;
        c=x-y;
        r=gcd(a,b);
        if(a<0)
        {
            a=-a; c=-c;
        }
        if(c%r) return 0*puts("Impossible");
        Exgcd(a,b,X=0,Y=0);
        X=X*c/r;
        ll tmp=b/r;
        X=(X>=0)?(X%tmp):(X%tmp+tmp);
        Wl(X);
        return 0;
    }
    /*
    input
    1 2 3 4 5
    output
    4
    */
    View Code
  • 相关阅读:
    WPF控件操作之改变父控件之TabControl示例
    WPF里面的DockPanel的Fill去哪了,如何填满整个空间
    [原创]winform自定义控件之类属性-多重属性-可折叠属性
    WinForm之DataBinding
    WinForm自定义控件之DefaultValue的误解
    code snippet:依赖属性propa的小技巧
    【原创】WinForm中实现单独Time控件的方式
    node.js安装本地模块遇到的目录锁定问题【新手问题】
    《程序员思维修炼》之德雷福斯模型
    IOptions、IOptionsMonitor以及IOptionsSnapshot
  • 原文地址:https://www.cnblogs.com/gaojunonly1/p/10440518.html
Copyright © 2020-2023  润新知