青蛙的约会

题目传送门
假设两只青蛙能碰面,且最少跳跃次数为t
则有式子 t m + x ≡ t n + y ( m o d L ) tm+x \equiv tn+y \pmod{L} tm+xtn+y(modL) 就是青蛙A和青蛙B经过k次跳跃的距离加上初始距离摸上L相等

式子又可以化为 t m + x + k 1 L = t n + y + k 2 L tm+x+k_1L = tn+y+k_2L tm+x+k1L=tn+y+k2L

化简为 t ( m − n ) + ( k 1 − k 2 ) L = y − x t(m-n)+(k_1-k_2)L=y-x t(mn)+(k1k2)L=yx

其中m-n和L和y-x都为已知数,令 k 1 − k 2 k_1-k_2 k1k2为k

那么式子就变成 a t + b k = c at+bk=c at+bk=c,用扩展欧几里得即可求解

因为通解 x = x 0 + k ∗ b d x=x_0+k*\frac{b}{d} x=x0+kdb,d为(a,b)的最大公约数,所以答案需要对b/d取模,但是b/d可能是负数,所以需要取绝对值

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll exgcd(ll a,ll b,ll &x1,ll &y1)
{
	if(b==0)
	  {
	  	x1=1,y1=0;
	  	return a;
	  }
	ll d=exgcd(b,a%b,x1,y1);
	ll t=x1;
	x1=y1;
	y1=t-a/b*y1;
	return d;
}

int main()
{
	ll x,y,m,n,l;
	cin>>x>>y>>m>>n>>l;
    
    ll a=m-n,b=l,c=y-x;
    
    ll x1,y1;
    ll d=exgcd(a,b,x1,y1);
    
    if(c%d==0)
      {
      	ll mod=abs(b/d);
      	x1=x1*(c/d);
      	ll ans=(x1%mod+mod)%(mod);
      	cout<<ans<<endl;
	  }
	else puts("Impossible");
	
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值