题目地址:http://poj.org/problem?id=1061
一道简单的拓展欧几里德模板题。可能许多人一开始看不出来和拓展欧几里德有什么关系。
下面分析:对于题意我们可以列出如下的式子, x + km = y+kn mod l, 进一步可以变换为k(n-m) = x-y mod l,看过我前面博客的人都应该看到过,a * x = 1(mod m)等价于 ax + my = 1。所以可以变换成 k(n-m) + l y = x-y。前面用到了一个性质就是 对称性:a≡b (% p)等价于b≡a (% p)。为什么用性质呢,是为了把变量k给变换出来,凑成咱们的式子。
接下来就是 ax + by = c的求法了。如果不会的话请参照这篇博客:https://blog.csdn.net/qq_43227036/article/details/99406800
AC代码:
#include <iostream>
using namespace std;
typedef long long ll;
void exgcd(ll a, ll b, ll &gcd, ll &x, ll &y)
{
if (b == 0)
{
x = 1;
y = 0;
gcd = a;
}
else
{
exgcd(b, a%b, gcd, y, x);
y -= (a/b)*x;
}
}
int main()
{
ios::sync_with_stdio(false);
ll x, y, m, n, l;
cin >> x >> y >> m >> n >> l;
ll a = n-m, b = l;
ll c = x-y;
ll gcd, tx, ty;
exgcd(a, b, gcd, tx, ty);
if (c % gcd != 0)
{
cout << "Impossible" << endl;
}
else
{
tx = tx * (c/gcd);
int mm = b/gcd;
tx = (tx%mm + mm) % mm;
cout << tx << endl;
}
return 0;
}