题解 P1516 青蛙的约会
Posted mark-x
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 P1516 青蛙的约会相关的知识,希望对你有一定的参考价值。
这道题,是一道挺有难度的题。
设两只青蛙跳了(a)步,则(A)蛙的坐标是(x+ma),(B)蛙的坐标是(y+na)
所以两只青蛙相遇的充分条件是(x+ma-(y+na) = Lb (b in Z))
提公因式得((m-n)a + (x-y) = Lb)
移项,方程两边同城(-1)得((n-m)a + Lb = (x-y))
令(x = (m-n)),(y = L),(d = gcd(x,y))
用扩展欧几里得解(xa + yb = d)的一组解((a,b))
若((x-y) \% d eq 0)或(m = n)无解
否则(a)就是我们求的一组解,但不一定是题目要求的解
所以还要对(a)进行操作
令(c = (x-y)),为了方便表示我们(swap(x,a) swap(y,b))
呢么我们本来要解的方程式是(ax_0+by_0 = c)
但是我们解的方程式是(ax_1+by_1 = d)
对于这个方程我们同乘(frac{c}{d})得(ax_1frac{c}{d}+by_1frac{c}{d} = c)
所以对于一组((x_1,y_1))符合(ax_1+by_1 = d),则必有一组((x_1frac{c}{d},y_1frac{c}{d}))符合(ax_0+by_0 = c)
又因为如果((x,y))是丢番图方程的一组解则((x-frac{b}{d} ,y+frac{a}{d}))也是一组解
所以如果我们知道(x)是一个正整数解,则最小就是让(x)不断地的减(frac{b}{d})这个过程就相当于取模((x_1frac{c}{d})\% frac{b}{d})
在把x,y,a,b换回来,并代入数据得(result = (a imes(frac{x-y}{d}) \% (frac{L}{d})+(frac{L}{d}))\%(frac{L}{d}))
coding
#include <iostream>
#define LL long long
using namespace std;
LL x,y,n,m,l;
inline LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(a == 0)
{
x = 0,y = 1;
return b;
}
register LL d = exgcd(b%a,a,y,x);
x -= b / a * y;
return d;
}
int main()
{
LL a,b,d;
cin >> x >> y >> m >> n >> l;
if(n < m) swap(m,n), swap(x,y);
d = exgcd(n-m,l,a,b);
if((x-y) % d || m == n) puts("Impossible");
else cout << (a*(x-y) / d % (l/d) + (l/d)) % (l/d) << endl;
return 0;
}
以上是关于题解 P1516 青蛙的约会的主要内容,如果未能解决你的问题,请参考以下文章