【题解】P1516 青蛙的约会
\(Description:\)
给出x,y,n,m,l,求解线性同余方程\(x+m*a \equiv y+a*n\pmod {l}\)中的a的最小值
\(Sample\) \(Input:\)
1 2 3 4 5
\(Sample\) \(Output:\)
4
不说瞎话直接化简:
跳过中间步骤:
\(a*(m-n)+b*l=y-x\)
那么就扩欧求一遍,对于=\(gcd(m-n,l)\)求一遍扩欧
再乘回去,最后有一个非常重要的点,为了让解尽可能的小
答案需要对\(l/gcd(m-n,l)\)取模。
暂时为什么还没推出来。。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int x,y,n,m,l,a,b,tmp;
inline int Exgcd(int a,int b,int &x,int &y){
if(!b){ x=1,y=0;return a;}
int temp=Exgcd(b,a%b,x,y);
int z=x;x=y;y=z-a/b*y;
return temp;
}
signed main(){
scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
int xx=m-n,yy=y-x;
if(xx<0) xx=-xx,yy=-yy;
tmp=Exgcd(xx,l,a,b);
if(yy%tmp!=0) return puts("Impossible"),0;
else printf("%lld\n",(a*(yy/tmp)%(l/tmp)+(l/tmp))%(l/tmp));
return 0;
}