查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!
第一次做扩展欧几里得。
x+mt=y+nt+kl 化成 x-y=(n-m)*t+kl
对右式做扩展欧几里得算法。若gcd(n-m,l)不能整除(x-y)。即不能相遇。
若能整除 则找到了一组解
当初要求小最的整数解。因为解群满意 (x+lcm/(n-m)*k)*(n-m)+(y+lcm/l*k)*l=d。
所以x对lcm/(n-m)取模则为案答。若取模小于即是0 要需再加lcm/(n-m)
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int exgcd(int n,__int64 &x,int m,__int64 &y)
{
if(m==0)
{
x=1;
y=0;
return(n);
}
else
{
int ans=(exgcd(m,x,n%m,y));
long long tmp=y;
y=x-n/m*y;
x=tmp;
return(ans);
}
}
int main()
{
int x,y,n,m,l;
scanf("%d %d %d %d %d",&x,&y,&m,&n,&l);
long long a1,a2;
int ans=exgcd(n-m,a1,l,a2);
if((x-y)%ans)
{
printf("Impossible\n");
}
else
{
long long tmp=l/ans;
a1=a1*(x-y)/ans;
a1%=tmp;
if(a1<=0) a1+=tmp;
printf("%lld\n",a1);
}
return 0;
}
文章结束给大家分享下程序员的一些笑话语录: 看新闻说中国输入法全球第一!领先了又如何?西方文字根本不需要输入法。一点可比性都没有。