洛谷 P1516 青蛙的约会(exgcd)
传送门
解题思路
碰面就是行走的路程差恰好是原来的差加上整数圈。
然后就可以列出一个不定方程:
\((n-m)t\equiv x-y\pmod L\)
也就是
\((n-m)t+k*L=x-y\)
便于最后计算最小正整数解,我们一开始就把a变成正数,注意c也要同时变。
AC代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<ctime>
using namespace std;
long long x,y,m,n,l;
long long a,b,c;
long long exgcd(long long a,long long b){
if(b==0){
x=1;
y=0;
return a;
}
long long gcd=exgcd(b,a%b);
swap(x,y);
y=y-(a/b)*x;
return gcd;
}
int main(){
cin>>x>>y>>m>>n>>l;
a=n-m;
b=l;
c=x-y;
if(a<0){
a=-a;
c=-c;
}
long long gcd=exgcd(a,b);
if(c%gcd!=0){
cout<<"Impossible"<<endl;
return 0;
}
cout<<((x*(c/gcd))%(b/gcd)+(b/gcd))%(b/gcd);
return 0;
}