zoukankan      html  css  js  c++  java
  • [BZOJ1477]青蛙的约会

    [BZOJ1477]青蛙的约会

    试题描述

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

    输入

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

    输出

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

    输入示例

    1 2 3 4 5

    输出示例

    4

    数据规模及约定

    见“输入

    题解

    不难得出这样一个式子:x + km ≡ y + kn (mod L)

    假设跳了 k 次,跳过了 k' 圈,变成等式 (m - n)k + Lk' = y - x

    其中 k, k' 为未知数,解一个不定方程。不可能的情况就是 gcd( (m - n), L ) 不能整除 y - x。

    。。。这题我也能WA两发,发现是自己智障,把 k 调整成整数应该“对 L 取模”“加 L”“对 L 取模”三步,我忘写第一步了。。。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <stack>
    #include <vector>
    #include <queue>
    #include <cstring>
    #include <string>
    #include <map>
    #include <set>
    using namespace std;
    
    const int BufferSize = 1 << 16;
    char buffer[BufferSize], *Head, *Tail;
    inline char Getchar() {
        if(Head == Tail) {
            int l = fread(buffer, 1, BufferSize, stdin);
            Tail = (Head = buffer) + l;
        }
        return *Head++;
    }
    int read() {
        int x = 0, f = 1; char c = Getchar();
        while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }
        while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }
        return x * f;
    }
    
    #define LL long long
    int x, y, m, n, L;
    
    LL gcd(LL a, LL b, LL& x, LL& y) {
    	if(!b){ x = 1; y = 0; return a; }
    	LL d = gcd(b, a % b, y, x); y -= (a / b) * x;
    	return d;
    }
    
    int main() {
    	x = read(); y = read(); m = read(); n = read(); L = read();
    	
    	if(m < n) swap(x, y), swap(m, n);
    	LL k, kk, d; // (m - n)k + Lk' = y - x
    	d = gcd((LL)m - n, (LL)L, k, kk);
    //	printf("%d * %lld + %d * %lld = %d
    ", n - m, k, L, kk, d);
    	if((y - x) % d == 0) printf("%lld
    ", ((k * (y - x) / d) % L + L) % L);
    	else puts("Impossible");
    	
    	return 0;
    }
    
  • 相关阅读:
    java处理高并发高负载类网站的优化方法
    谈谈Memcached与Redis
    php中const与define的使用区别 详解
    ecshop添加模板与库文件
    ECShop 2.5.1 的结构图及各文件相应功能介绍
    Uva10972(RevolC FaeLoN)
    交叉染色法判断二分图
    边双联通问题求解(构造边双连通图)POJ3352(Road Construction)
    POI1999(仓库管理员)
    ZOJ1311(Network)
  • 原文地址:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/5513418.html
Copyright © 2011-2022 走看看