【题解】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;
}

转载于:https://www.cnblogs.com/JCNL666/p/10680334.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值