洛谷P1516 青蛙的约会

来源:互联网 发布:淘宝网b2c 编辑:程序博客网 时间:2024/05/17 22:47

线性同余方程

题目传送门

设两只青蛙跳了t步,那么当他们相遇时满足x+mtynt=kl(kZ)
(nm)t+kl=xy

设n-m=A,x-y-B,那么题目即转化为对于同余方程AtB( mod l),求最小的正整数解t。
然后就可以用扩展欧几里得解决了。

M=l/gcd(a,l)
如果B mod exgcd(A,l)0或者m=n则无解,否则答案为((B/gcd(A,l)) mod M)+M) mod M

注意如果m>n是要交换的(别问我为什么)

代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;LL x,y,m,n,l;LL exgcd(LL a,LL &x,LL b,LL &y){    if (b==0){        x=1; y=0; return a;    }    LL ret=exgcd(b,x,a%b,y);    LL t=x; x=y; y=t-a/b*y;    return ret;}int main(){    scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);    LL p,q; if (n<m){        swap(n,m); swap(x,y);    }    LL t=exgcd(n-m,p,l,q);    if ((x-y)%t||m==n){        printf("Impossible\n");        return 0;    }    LL MOD=l/t;    p=(p*((x-y)/t))%MOD;    printf("%lld\n",(p+MOD)%MOD);    return 0;}
原创粉丝点击