R - 青蛙的约会(扩展欧几里德)

在这里插入图片描述
在这里插入图片描述

这道题我按照题的意思自己到是把等式写出来了,但是因为我不知道有扩展欧几里德所以自己就算不来,后来百度和CSDN搜了一下,到时觉得计算机很强大!!可以解方程(同时也了解到了扩展欧几里德,还是很欣慰得);
根据题意我把等式列了出来:
在这里插入图片描述
因为他们用的时间都是一样的,所以我这里设为t;
我可以把上式简写为:
在这里插入图片描述
然后可以写成:
在这里插入图片描述
这里是根据对照系数法写的哈;黑色的x,y和蓝色的x,y不是一回事哈;
这样我们现在的目的就是去求t(也就是上面的蓝色x了);
那么根据扩展欧几里德我们可以知道:
exgcd(A,B,x,y)返回的为gcd(A,B);
并且存在解的充分必要条件为:
在这里插入图片描述
如果我们要求出x的最小整数解,那么我们可以利用:

在这里插入图片描述
这样我们就可以利用取模来求解最小整数x的解了(在这之前我们算出来的是x0,并且返回的是gcd(A,B),他和C成倍数,所以需要x0=x0*(C/gcd(A,B)(可以从方程的倍数去理解(就像是化简一样))):
在这里插入图片描述
那么问题就分析到这里了,现在就可以写出来了;

#include<iostream>
#include<cstdio> 
using namespace std;
typedef long long ll;
//扩展欧几里德 
ll gcd(ll a,ll b){
	 return b?gcd(b,a%b):a;
}
ll exgcd(ll a,ll b,ll &x,ll &y)//a==m-n ,b==L , x==c, y为求的结果 
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    else
    {
        ll res=exgcd(b,a%b,y,x);
        y-=a/b*x;
        return res;
    }
}
int main(){
    ll x,y,m,n,L,K,Z;
    cin>>x>>y>>m>>n>>L;
    ll A=n-m,B=L,C=x-y;
    if(C%gcd(A,B)==0){
        ll e=exgcd(A,B,K,Z);
        ll te=L/e;
        K=K*C/e;
        K=(K%te+te)%te;
        cout<<K<<endl;
	}else{
		 cout<<"Impossible\n";
	}
	 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值