青蛙的约会详解(扩展欧几里得)

solution:输入,a,b,m,n,l,则(a+mt)%l==(b+nt)%l时,他们相遇

不定方程:(n+m)x+ly=b-a。化为ax+by=c的形式,可以判断,若c!=gcd(a,b)则青蛙永远不能相遇

接下来用exgcd求出一组特解x0,y0。

假设am + bn == gcd(a,b).

当c % gcd(a,b) == 0 时有解,令 k * gcd(a,b) == c;

=> k*a*m + k*b*n == k*gcd(a,b);

=>x == k*m == c*m/gcd(a,b)  ,  y == k*n == c*n/gcd(a,b) ;

设 X0 ,Y0 是 a*x + by 的某一特解。则 该不定方程的通解为

X = X0 - b/gcd(a,b)*t;

Y = Y0 + a/gcd(a,b)*t;            t为任意一个整数

X = (c*M0 - b*t)/gcd(a,b);

Y = (c*N0 + a*t)/gcd(a,b);

 求出a*x + b*y ==c 的通解为    X = (c*x0 - b*t)/gcd(a,b);  Y = (c*y0 + a*t)/gcd(a,b);

则最小整数解为:x=(c*x0)/gcd(a,b)

#include <bits/stdc++.h>
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define ll long long
#define ld long double
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define lcm(a,b) ((a)*(b)/(__gcd((a),(b))))
//#define mod 100003
#define MP make_pair
#define PI pair<int,int>
using namespace std;
const int N = 1e6 + 10;
const int MOD = 1e9 + 7;
ll x, y, m, n, l, t, a, b;
ll exgcd(ll a, ll b) {
    if (b == 0) {
        x = 1, y = 0;
        return a;
    }
    ll d = exgcd(b, a % b);
    ll t = x;
    x = y;
    y = t - a / b * y;
    return d;
}
int main() {
    cin >> a >> b >> m >> n >> l;
    ll r = exgcd(m - n, l);//r是最大公约数
    if((b - a) % r) {
        cout << "Impossible";
        return 0;
    }
    x = (x * ((b - a) / r) % l / r + l / r) % l / r;//最小非负数解
    cout << x;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Endeavor_G/article/details/88997098