这道题我按照题的意思自己到是把等式写出来了,但是因为我不知道有扩展欧几里德所以自己就算不来,后来百度和CSDN搜了一下,到时觉得计算机很强大!!可以解方程(同时也了解到了扩展欧几里德,还是很欣慰得);
根据题意我把等式列了出来:
因为他们用的时间都是一样的,所以我这里设为t;
我可以把上式简写为:
然后可以写成:
这里是根据对照系数法写的哈;黑色的x,y和蓝色的x,y不是一回事哈;
这样我们现在的目的就是去求t(也就是上面的蓝色x了);
那么根据扩展欧几里德我们可以知道:
exgcd(A,B,x,y)返回的为gcd(A,B);
并且存在解的充分必要条件为:
如果我们要求出x的最小整数解,那么我们可以利用:
这样我们就可以利用取模来求解最小整数x的解了(在这之前我们算出来的是x0,并且返回的是gcd(A,B),他和C成倍数,所以需要x0=x0*(C/gcd(A,B)(可以从方程的倍数去理解(就像是化简一样))):
那么问题就分析到这里了,现在就可以写出来了;
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
//扩展欧几里德
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
ll exgcd(ll a,ll b,ll &x,ll &y)//a==m-n ,b==L , x==c, y为求的结果
{
if(b==0)
{
x=1;
y=0;
return a;
}
else
{
ll res=exgcd(b,a%b,y,x);
y-=a/b*x;
return res;
}
}
int main(){
ll x,y,m,n,L,K,Z;
cin>>x>>y>>m>>n>>L;
ll A=n-m,B=L,C=x-y;
if(C%gcd(A,B)==0){
ll e=exgcd(A,B,K,Z);
ll te=L/e;
K=K*C/e;
K=(K%te+te)%te;
cout<<K<<endl;
}else{
cout<<"Impossible\n";
}
return 0;
}