首页 > 其他 > 详细

【题解】P1516 青蛙的约会

时间:2019-04-09 22:46:10      阅读:146      评论:0      收藏:0      [点我收藏+]

\(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;
}

【题解】P1516 青蛙的约会

原文:https://www.cnblogs.com/JCNL666/p/10680334.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!