扩欧,80pts求助,代码有注释

P1516 青蛙的约会

@[Drind](/user/305854) 如果 $y-x<0,m-n>0$ 你的代码就废了,$m,n$ 和 $x,y$ 不对应了
by __er @ 2023-07-03 09:53:54


@[Drind](/user/305854) ```cpp #include<bits/stdc++.h> using namespace std; long long exgcd(long long a,long long b,long long &x,long long &y){//扩欧板子 if(b==0){ x=1; y=0; return a; } long long k=exgcd(b,a%b,x,y); long long t=x; x=y; y=t-(a/b)*y; return k; } int main() { long long x,y,m,n,L,a,b,gcd,tmp,ans; cin>>x>>y>>m>>n>>L;//列出方程x+km=y+kn(mod L),化为同余方程k(m-n)=y-x(mod L),其中k为碰面需要的次数 if(n-m<0)swap(x,y),swap(m,n); tmp=x-y;//%L+L%L保证y-x为正 gcd=exgcd(n-m,L,a,b); if(tmp%gcd!=0){//判断同余方程是否有解 cout<<"Impossible\n"; return 0; } ans=((a * (tmp / gcd)) % (L / gcd) + (L / gcd)) % (L / gcd); cout<<ans<<endl; } ```
by __er @ 2023-07-03 10:01:13


@[__er](/user/713955) 为什么要把L改成(L/gcd)
by Drind @ 2023-07-03 10:15:46


@[Drind](/user/305854) 你可能式子推错了
by __er @ 2023-07-03 10:51:25


看看题解区 FlashHu 的推导?
by __er @ 2023-07-03 10:52:13


|