【题解】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;
}
posted @ 2019-04-09 22:32  章鱼那个哥  阅读(108)  评论(0编辑  收藏  举报