ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P1516 青蛙的约会

2021-09-04 18:31:06  阅读:228  来源: 互联网

标签:return int P1516 约会 exgcd 青蛙 long ll qwq


P1516 青蛙的约会

传送门

好吧,这是一道裸的拓欧,我也不知道为什么要写这篇博客qwq~~~~

下面开始分析:


我们设总共跳T次可以相遇:

则 A坐标:X+MT; B坐标:Y+NT

那么可以得出:

相遇的充要条件为:(X+MT)-(Y+NT)=PL //P是整数,PL是纬线长度的P倍

变形为:(N-M)* T + L * P=X-Y//T为所求

如果变形成那样还没看出来,那么变成这样总能看出来了吧:(M-N)* T$\equiv$ ≡ (Y-X)(mod L)(注意这个地方有变号,即N-M被我设作M-N,为的是让等式右边冠正号)

没错,它就是个一次同余方程,而我们要做的就是求出它的最小正整数解qwq(特别注意,是正整数,这里有个小坑,后面会讲)

那这就简单了,我们可以通过扩展欧几里德算法求出一组特解,然后对于这组特解,我们再推导出最小解来。

直接套上求最小值代码即可:

x1=(x*(a/d)+l/d)%(l/d);//计算第一个解 
cout<<(x1+(l/d))%(l/d);	

拓展欧几里得算法应该再熟悉不过了吧

int exgcd(long long a,long long b,long long &x, long long &y)
{
   if(b==0)
   {
       x=1;
       y=0;
       return a;
   }
   d=exgcd(b,a%b,x,y);
   long long t=x;
   x=y;
   y=t-a/b*y;
   return d;
}

然后就信心满满的交上去了,结果发现只获得了70分,怎么回事?

因为gcd只对非负整数有意义,所以如果a<0等式两边要同时取负。

    ll a=x-y;
    ll b=n-m;
    if(b<0)
    {
        b=-b;
        a=-a;
    }

最后放上我的AC代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll m,n,x,y,l;
ll d;
int exgcd(ll a,ll b,ll &x,ll &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    d=exgcd(b,a%b,x,y);
    ll temp=x;
    x=y;
    y=temp-a/b*y;
    return d;
}
int main()
{
    cin>>x>>y>>m>>n>>l;
    ll a=x-y;
    ll b=n-m;
    if(b<0)
    {
        b=-b;
        a=-a;
    }
    exgcd(b,l,x,y);
    if(a%d)
        printf("Impossible");
    else
        {
            int x1=(x*(a/d)+(l/d))%(l/d);//计算第一个解 
	    printf("%d ",(x1+(l/d))%(l/d));	
        }
    return 0;
}


总之,虽然是裸的exgcd题,但是很容易被细节实现坑到,尤其是求最小非负整数解和处理负数的地方。

完结撒花~~~~

标签:return,int,P1516,约会,exgcd,青蛙,long,ll,qwq
来源: https://www.cnblogs.com/fzh050919/p/15227414.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有