青蛙的约会<数论,extgcd>

原创 2016年05月30日 21:10:56

青蛙的约会

题意:

在一个圆上有一个零刻度点,公青蛙和母青蛙分别在A点和B点<不同的位
置>,他们每秒行走的距离分别是m和n,圆的周长是L。问题是这两个青
蛙能不能相遇,若能在什么时候相遇?

解:

<对于初学者来说,解得过程是漫长的>假设可以相遇,相遇的时间是x,并且相遇的时候快的比慢的多了圈,则可得方程:(A+m*X)-(B+n*X)=Y*L:里得算法。
什么是扩展欧几里得?

extgcd:

如何求aX+bY=C的一个解?令d=gcd(a,b);等式两边同时除d,a/d*X+b/d*Y=C/d.这里有一个pint,a、b除以d一定是整数,但是c不一定,如果c/d不是整数,那么说明青蛙不能相遇,无解。易知道,a*X0+b*y0=d,<一定有解>有解(x0,y0)
定理一:如果d = gcd(a, b),则必能找到正的或负的整数k和l,使d = a*k + b*l。
。两边同时乘上C/d.得a*(C/d*X0)+b*(C/d*y0)=c。得一解,x=C/d*X0,y=C/d*y0。扩展欧几里得的作用是什么呢?求x0,y0,和d。

void extgcd(LL a,LL b,LL&d,LL &x,LL &y)
{
    if(!b){d=a;x=1,y=0;}
    else{
        extgcd(b,a%b,d,y,x);
        y-=x*(a/b);
    }
}

具体是这样:递归
由于gcd(a, b) = gcd(b, a%b) ,有ax0 + by0 = gcd(a, b) = gcd(b, a%b) = bx1 + (a%b)y1,而a%b又可以写成a-a/b*b,所以=bx1 + (a-a/b*b)y1 = ay1 + b(x1-a/b*y1),所以如果我们求出gcd(b, a%b) = bx1 + (a%b)y1的x1和y1,那么通过观察就可以求出x0 = y1,y0 = (x1 - a/b*y1)。那我们怎样求x1和y1呢?当然是求x2和y2了,做法一样的。一直求到gcd(an, 0) = an*xn + 0 * yn,这时令xn=1,yn=0就完事了,就可以求xn-1和yn-1,然后xn-2和yn-2,然后一直求到x0和y0了。

定理二:若gcd(a, b) = 1,则方程ax ≡ c (mod b)在[0, b-1]上有唯一解。

定理三:若gcd(a, b) = d,则方程ax ≡ c (mod b)在[0, b/d - 1]上有唯一解。

上面说过,这个该死的方程等价于ax + by = c,如果有解,两边同除以d,就有a/d * x + b/d * y = c/d,即a/d * x ≡ c/d (mod b/d),显然gcd(a/d, b/d) = 1,所以由定理二知道x在[0, b/d - 1]上有唯一解。所以ax + by = c的x在[0, b/d - 1]上有唯一解,即ax ≡ c (mod b)在[0, b/d - 1]上有唯一解,得证!
如果得到ax ≡ c (mod b)的某一特解X,那么我令r = b/gcd(a, b),可知x在[0, r-1]上有唯一解,所以我用x = (X % r + r) % r就可以求出最小非负整数解x了!(X % r可能是负值,此时保持在[-(r-1), 0]内,正值则保持在[0, r-1]内。加上r就保持在[1, 2r - 1]内,所以再模一下r就在[0, r-1]内了)

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long  LL;
void extgcd(LL a,LL b,LL&d,LL &x,LL &y)
{
    if(!b){d=a;x=1,y=0;}
    else{
        extgcd(b,a%b,d,y,x);
        y-=x*(a/b);
    }
}
int main ()
{
    LL x,y,m,n,L,d,r,X,Y;
    while(~scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&L))
    {
        extgcd(n-m,L,d,X,Y);r=L/d;
        if((X-Y)%d)printf("Impossible\n");
        else printf("%lld\n",((X-Y)/d*x%r+r)%r);
    }
    return 0;
}

来源+整理

版权声明:本文为博主原创文章,未经博主允许不得转载。

页面省市区级联

js省市级联
  • u013421749
  • u013421749
  • 2015年05月08日 11:00
  • 1913

贪心算法之加油问题

【汽车加油问题】一辆汽车加满油后可以行驶n千米。旅途中有k个加油站。若要使沿途的加油次数最少,设计一个有效的算法,指出应在那些加油站停靠加油。 数据输入:由文件input.txt 给出输入数据。第一行...
  • qq_31028891
  • qq_31028891
  • 2016年10月28日 14:48
  • 921

POJ 1061 青蛙的约会

先说一下大概题意:有两只青蛙,一只在坐标x,另一直在坐标y,青蛙x一次跳跃可以前进m单位距离,青蛙y一次跳跃可以前进n单位的距离,两青蛙都在同一纬度,该纬度长度为L。两只青蛙同方向同时跳啊跳,问你最少...
  • ilovexiaohao
  • ilovexiaohao
  • 2013年08月06日 09:37
  • 1088

配置Tomcat的访问日志格式化输出

转自:http://goon.iteye.com/blog/1814609
  • zhang_Red
  • zhang_Red
  • 2014年08月24日 20:07
  • 2125

HDU 1695 GCD (欧拉函数,容斥原理)

HDU 1695 GCD (欧拉函数,容斥原理)
  • Dacc123
  • Dacc123
  • 2016年04月25日 11:05
  • 321

NOIP2008 普及组T2 排座椅 解题报告-S.B.S

题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。同...
  • SBS2000
  • SBS2000
  • 2016年05月02日 16:44
  • 441

Linux命令CURL用法

Curl是一个命令行方式下传输数据的开源传输工具,支持多种协议包括:FTP,HTTP,HTTPS,IMAP,POP3,TELNET等。同样支持HTTP POST方法,PUT方法,FTP上传,cooki...
  • zzzmmmkkk
  • zzzmmmkkk
  • 2014年08月14日 23:45
  • 35288

【bzoj2045】双亲数

Description小D是一名数学爱好者,他对数字的着迷到了疯狂的程度。 我们以d = gcd(a, b)表示a、b的最大公约数,小D执著的认为,这样亲密的关系足可以用双亲来描述,此时,我们称有序数...
  • w_yqts
  • w_yqts
  • 2017年06月24日 16:04
  • 120

在数组中找出两个数a、b,使得a加b等于给定的c

题目:有一个整数数组array,给定整数sum,从这两个数中选取两个数a、b,使得a+b = sum。 《编程之美2.12 》 一、满足条件的两个数 找出两个数a、b,使得a + b = sum;等价...
  • u013074465
  • u013074465
  • 2015年08月14日 16:57
  • 1912

扩展欧几里得extgcd

简单写一下最大公约数:
  • bit_Line
  • bit_Line
  • 2014年07月27日 10:01
  • 763
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:青蛙的约会<数论,extgcd>
举报原因:
原因补充:

(最多只允许输入30个字)