1516青蛙的约会

典型的exgcd题目。 设走k步,首先由题目可得 (mk+x)%l=(nk+y)%l;由同余公式可得 (mk+x)%l-(nk+y)%l=0; ((mk+x)%l=(nk+y)%l)%l=0; 即mk-nk+x-y=ul【u为一整数】。 k(m-n)-ul=y-x。 把k看成x,n-m看成a,l看成b,u看成y即可求exgcd; 此题还要对最后结果去最小整数解,公式见代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define xx 10010 
long l,x,y,m,n;
long xz,yz,r;
int exgcd(long a,long b)
{
    if(b==0)
    {
        xz=1;
        yz=0;
        return a;
    }
    r=exgcd(b,a%b);
    long u=xz;
    xz=yz;
    yz=u-(a/b)*yz;
    return r;
}
int main()
{
    cin>>x>>y>>m>>n>>l;
    long az=n-m,bz=l;
    long a=x-y;
    if(az<0)//负数处理。 
    {
        az=-az;
        a=-a;
    }
    exgcd(az,bz);
    if(a%r!=0) 
    cout<<"Impossible";
    else
    cout<<((xz*(a/r))%(l/r)+(l/r))%(l/r);
    //有特殊解得最小解的公式。 
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值