[BZOJ1477]青蛙的约会

Posted xjr_01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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", n - m, k, L, kk, d);
	if((y - x) % d == 0) printf("%lld\n", ((k * (y - x) / d) % L + L) % L);
	else puts("Impossible");
	
	return 0;
}

 

以上是关于[BZOJ1477]青蛙的约会的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1477: 青蛙的约会(exgcd)

BZOJ1477: 青蛙的约会

bzoj1477: 青蛙的约会

bzoj1477: 青蛙的约会(exgcd)

bzoj 1477: 青蛙的约会exgcd

JZOI2002BZOJ1477P1371青蛙的约会