青蛙的约会

题意:

在一个圆上有一个零刻度点,公青蛙和母青蛙分别在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;
}

来源+整理

青蛙的约会<数论,extgcd>的更多相关文章

  1. ACM: POJ 1061 青蛙的约会 -数论专题-扩展欧几里德

    POJ 1061 青蛙的约会 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld & %llu  Descr ...

  2. POJ 1061 青蛙的约会 数论水题

    http://poj.org/problem?id=1061 傻逼题不多说 (x+km) - (y+kn) = dL 求k 令b = n-m ; a = x - y ; 化成模线性方程一般式 : Lx ...

  3. 数论练习(5)——青蛙的约会(扩gcd)

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 122502   Accepted: 26015 Descript ...

  4. 数学--数论--POJ 1061青蛙的约会 (扩展欧几里得算法)

    青蛙的约会 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问 ...

  5. POJ 1061青蛙的约会(拓展欧几里德算法)

    题目链接: 传送门 青蛙的约会 Time Limit: 1000MS     Memory Limit: 65536K Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见 ...

  6. poj 1061青蛙的约会

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 90083   Accepted: 16257 Descripti ...

  7. poj1061 青蛙的约会 扩展欧几里德的应用

    这个题解得改一下,开始接触数论,这道题目一开始是看了别人的思路做的,后来我又继续以这种方法去做题,发现很困难,学长告诉我先看书,把各种词的定义看懂了,再好好学习,我做了几道朴素的欧几里德,尽管是小学生 ...

  8. POJ 1061 青蛙的约会(拓展欧几里得求同余方程,解ax+by=c)

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 122871   Accepted: 26147 Descript ...

  9. POJ青蛙的约会

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 114412   Accepted: 23446 Descript ...

随机推荐

  1. SERVICE_USE_PID

    openwrt中启动脚本中经常出现如下一句: SERVICE_USE_PID=1 例如 lldp启动脚本 lldpd.init中如下: #!/bin/sh /etc/rc.common # Copyr ...

  2. HDU 1509 Windows Message Queue(队列)

    题目链接 Problem Description Message queue is the basic fundamental of windows system. For each process, ...

  3. hdu 1407 测试你是否和LTC水平一样高

    Description 大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目,我敢保证你和他绝对在一个水平线上! 你的任务是: 计算方程x^2+y^2+z^2= num的一个正整数解.  Inpu ...

  4. c/c++常用的几个关键字总结

    一.volatile volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据.如果没有volatile关键字,则编 ...

  5. php笔记(一)面向对象编程

    <?php //定义一个类 class Car { var $name = '汽车'; function getName() { return $this->name; } } //实例化 ...

  6. windows 查 mac

    各位,登记一下新电脑 序列号 和 MAC,麻烦大家私信发给我.1.序列号在主机有标签,类似 "Servial NO.   4CV5149L2H"2.MAC,按<“开始”+r  ...

  7. 在64位Win7操作系统中安装Microsoft Access Engine的解决方案

    在64位Win7操作系统中安装Microsoft Access Engine的解决方案 现在的Win7系统中安装的一般都是32位的Office,因为微软推荐使用32位的Office,兼容性更强,稳定性 ...

  8. js常用API 数据类型 基本类型,基本包装类型,引用类型 Object String Array Boolean Number Date Math

    数据类型 变量.作用域及内存 基础类型(primitive value):Undefined.Null.Boolean.Number和String.这些类型在内存中分别占用固定大小的空间,他们的值保存 ...

  9. 用yum安装JDK(CentOS)

    1.查看yum库中都有哪些jdk版本 [root@localhost ~]# yum search java|grep jdk 2.选择版本,进行安装 [root@localhost ~]# yum  ...

  10. 关于Webdriver自动化测试时,页面数据与数据库id不一致的处理方式,需要使用鼠标事件

    有时候Web页面需要通过onmouseout事件去动态的获取数据库的数据,在使用Webdriver进行自动化测试的时候,对于页面显示的数据,其在数据库可能会存在一个id或者code,但是id或者cod ...