分析:比较明显的扩展欧几里得,然后。。我就没看懂大家的打法。。问了一个神犇才知道。。
我们先解出Ax+By=C的解,然后,现在我们知道了一组通解,然后要求一组特解,即x最小,我们可以先求出gcd(A,B),然后对于整个方程组除以gcd,这样球出来的就是最小解了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
typedef long long ll;
ll n,m;
inline ll gcd(ll x,ll y)
{
if (x%y==0)return y;
else return gcd(y,x%y);
}
inline void exgcd(ll a,ll b,ll &x,ll &y)
{
if (b==0)
{
x==1,y==0;
return;
}
exgcd(b,a%b,x,y);
ll t=x;
x=y,y=t-a/b*y;
}
int main()
{
ll x,y,l;
scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
int a=n-m,b=l,c=x-y;
int t=gcd(a,b);
if (c%t!=0)
{
printf("Impossible\n");
return 0;
}
a/=t,b/=t,c/=t;
exgcd(a,b,x,y);
x=((x*c)%b+b)%b;
if (!x)x+=b;
printf("%lld\n",x);
return 0;
}