洛谷 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;
}
posted @ 2021-05-16 21:07  尹昱钦  阅读(51)  评论(0编辑  收藏  举报