扩展欧几里德应用 poj 1061
题目链接:http://poj.org/problem?id=1061
题目思路:题目最终可以化为 (m-n)a ≡ (x-y) (%L)
也可以进一步看作 (m-n)a + Lb = (x-y) 求最小正a值。
这题可以看出,扩展欧几里德适用于负数。
若没有接触过扩展欧几里德,可以点击:
http://blog.csdn.net/qq_33199236/article/details/51429013
ac代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <map>
#include <string>
using namespace std;
long long exgcd(long long a,long long b,long long& x,long long& y)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
long long d = exgcd(b,a%b,x,y);
long long temp = x;
x = y;
y = temp - a/b*y;
return d;
}
int main()
{
long long lu1,lu2,m,n,l;
cin >> lu1 >> lu2 >> m >> n >> l;
long long x,y;
long long d = exgcd(n-m,l,x,y);
if((lu1-lu2)%d == 0)
{
long long r = l/d;
x = x*(lu1-lu2)/d;
x = (x%r+r)%r;
printf("%I64d\n",x);
}
else
printf("Impossible\n");
return 0;
}