扩展欧几里得
详细介绍 : http://hi.baidu.com/%B1%BF%D0%A1%BA%A2_shw/blog/item/0676025d56a87d4afbf2c093.html
扩展欧几里得的代码是照着小白打的。。
发现代码挺好的。。
说一下扩展欧几里得
设 a, b, c为任意整数, 若方程 ax + by = c的一组整数解为 ( x0, y0 ),则它的任意整数解都可以写成 ( x0 + kb', y0 - ka' ),其中 a' = a/gcd(a,b), b' = b/gcd(a,b),k为任意整数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
#define eps 1e-8
#define ll long long
#define ull unsigned long long
#define mnx 1005
void exgcd( ll a, ll b, ll &d, ll &x, ll &y ){
if( !b ) {
d = a, x = 1, y = 0; // d恰好是最大公约数
}
else {
exgcd( b, a%b, d, y, x );
y -= x*(a/b);
}
}
int main(){
ll x, y, m, n, l;
ll a, b, c, d, t;
while( cin>>x>>y>>m>>n>>l ){
a = n-m, b = l, c = x-y;
exgcd( a, b, d, x, y );
if( c % d ){
printf("Impossible\n");continue;
}
ll ans = x*(c/d); // 不能写挫了 ans = x/d*c, 这样wa死你 ans是方程的一组整数解
t = b/d; // b' = b/gcd(a,b);
ans = (ans%t+t) % t; // 最小整数解就出来了,自己意会一下
cout<<ans<<endl;
}
return 0;
}