寒假集训专题四-G.青蛙的约会


g青蛙的约会

题意:两青蛙在环形的轨道上不同位置开始运动,求相遇的时间

思路:

根据题意可知 即求x+mt≡y+nt(mod L)的解

根据同余可化为 L|(x+mt-y-nt)

进一步化为 kL+(n-m)t=x-y

这里k为整数(因为可能是当圈相遇,也可能套圈),即求t的最小正整数解

注意:gcd仅对正整数生效,并且右边x-y是负数不影响

最后套入扩欧公式

最小正整数解公式

\[(x*(c/gcd)mod(b/gcd)+b/gcd)mod(b/gcd) \]

可以这样想 -1%3 下的答案是?2 可以用floor_mod

int  floor_m(int n,int m)
{
	return n-(floor(n/(float)m)*m);
} 
#include
#include
using namespace std;
typedef long long ll;

ll gcd(ll a, ll b)
{
	if(b==0) return a;
	return gcd(b,a%b);
}
ll exgcd(ll a,ll b,ll &x,ll &y)
{
	if(b==0) {x=1,y=0;return a;};
	ll d=exgcd(b,a%b,x,y);
	ll z=x; x=y; y=z-a/b*y;
	return d;
}
int main()
{
	ll x,y,m,n,l;
	cin>>x>>y>>m>>n>>l;
	if(m>n) swap(m,n),swap(x,y); 
	ll d=x-y;
	ll z=n-m;
	ll g=gcd(l,z);
	if(z == 0 ||d%g!=0)
	{
		cout<<"Impossible";
		return 0;
	}
	ll a,b;
	ll f=exgcd(l,z,a,b);
	b=(b*d/g%(l/g)+l/g)%(l/g);
	cout<

相关