Luogu_P1516【题解】青蛙的约会 exgcd

题目链接:https://www.luogu.org/problem/P1516

由题目可以得出:

  x+k*m=y+k*n(mod l)

将mod l放入公式:

  (x-y)=(n-m)*k+l*t

设n-m为w 设x-y为c

  k*w + l*t = c

那么就可以用exgcd来求解了。

先解出

  k*w + l*t = d = gcd(w,l) 

然后把答案乘 c/d 就可以求出了。

但是还不是最优解,有一个神仙公式,也就是代码统计答案的最后一行。

取个模。

代码如下:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll X,Y,m,n,l,x,y;
ll exgcd(ll a,ll b,ll &x,ll &y){
    if(!b){
        x=1;y=0;
        return a;
    }
    ll ans=exgcd(b,a%b,x,y);
    ll z=x;
    x=y;
    y=z-y*(a/b);
    return ans;
}
int main()
{
    scanf("%lld%lld%lld%lld%lld",&X,&Y,&m,&n,&l);
    ll k=n-m,s=X-Y;
    if(k<0){
        k=-k;s=-s;
    }
    ll ans=exgcd(k,l,x,y);
    if(s%ans!=0) printf("Impossible\n");
    else printf("%lld\n",(x*(s/ans)%(l/ans)+(l/ans))%(l/ans));
    //system("pause");
    return 0;
}

 

转载于:https://www.cnblogs.com/ChrisKKK/p/11442378.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值