码迷,mamicode.com
首页 > 其他好文 > 详细

Luogu1515 青蛙的约会

时间:2018-02-27 14:00:03      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:swap   algorithm   swa   code   scan   https   body   stream   algo   

Luogu

假设两只青蛙一共跳了 \(t\) 次,那么可以得到

\[x+tm≡y+tn\ (mod\ \ \ l)\]

将这个式子拆开

\[(x+tm) \ \ \ mod \ \ \ l=(y+tn)\ \ \ mod\ \ \ l\]

可得

\[l|x+tm-y-tn\]

\(\frac{x+tm-y-tn}{l}=r\)

可得

\[x+tm-y-tn=lr\]

合并一下同类项

\[t(m-n)+x-y=lr\]

移一下项

\[t(m-n)-lr=y-x\]

将两边都乘 \(-1\)

\[t(n-m)+lr=x-y\]

可以发现就是一个不定方程,拓展欧几里得求解即可。

拓展欧几里得够求解类如\(ax+by=c\)的不定方程,其中\(gcd(a,b)|c\),所以只要\((x-y)\ \ \ mod \ \ \ gcd(n-m,L)≠0\)就是无解的了。

#include <iostream>
#include <cstdio>
#include <algorithm>

typedef long long ll;

ll X, Y, N, M, L, T, R;

ll gcd(ll x, ll y)
{
    return y ? gcd(y, x % y) : x;
}

void ex_gcd(ll a, ll b, ll c, ll &x, ll &y)
{
    if(b == 0)
    {
        x = c / a;
        y = 0;
        return;
    }
    ex_gcd(b, a % b, c, y, x);
    y = y - (a / b) * x;
}

int main()
{
    scanf("%lld %lld %lld %lld %lld", &X, &Y, &M, &N, &L);
    if(N < M)
    {
        std::swap(X, Y);
        std::swap(N, M);
    }
    if((X - Y) % gcd(N - M, L))
    {
        puts("Impossible");
        return 0;
    }       
    ex_gcd(N - M, L, X - Y, T, R);
    printf("%lld\n", (T % (L / gcd(N - M, L)) + (L / gcd(N - M, L))) % (L / gcd(N - M, L)));
    return 0;
}

Luogu1515 青蛙的约会

标签:swap   algorithm   swa   code   scan   https   body   stream   algo   

原文地址:https://www.cnblogs.com/zcdhj/p/8478353.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!