题意:

青蛙 A 和 青蛙 B ,在同一纬度按照相同方向跳跃相同步数,A的起点为X ,每一步距离为m,B的起点为Y,每一步距离为 n,一圈的长度为L,求最小跳跃步数。

思路:

一开始按照追击问题来写,结果发现会求出来小数,而且按照追击问题写的话,一圈就能相遇,但是!青蛙的步数可没有小数,而且青蛙是跳跃的,显然不能在空中相遇吧。

所以咧,先列出一个追击的式子 ,设步数为 t ,整数为K(转了K圈以后他们才到同一个地方)

t * m + x = t * n + y + k * L ===> t * ( n - m ) + k * L = x - y

贝祖公式 a * x +b * y = gcd ( a , b )

当 a * x +b * y = W 时,W % gcd(a,b) = = 0

x 的最小正整数解就是要求的答案

再看扩展欧几里得

long long exgcd(long long a,long long b)
{
if(b==0)
{
x=1;
y=0;
return a;
}
long long r=exgcd(b,a%b);
long long temp=x;
x=y;
y=(temp-a/b*y);
return r;
}

在求a , b 的最大公约数的时候 a % b = a - (a / b) * b

a * x + b * y =gcd(a,b) ==> b * x1 + a%b * y1 = gcd( a , b )

展开得 :a * y1 +b[ x1 - ( a / b) * y1 ] = gcd( a , b )

可得 x = y1 , y= [ x1 - ( a / b) * y1 ] ;

当余数为也就是b 为 0,返回值 为 a,根据 a * x + b * y =gcd(a,b),x=1,y=0,在通过递归的回溯,计算上一个状态的 x 和 y。

最后求得的 x 可能是负数那就要找最小正整数解。

当一组解为(x, y ),那么通解公式就是 (x+b/gcd , y + a/gcd)

b/gcd 为整数的时候,它是x的解的一个周期,根据这个周期找到第一个正整数。

            long long t=l/k;//根据通解公式 (x1,y1)为一组通解,则(x1+b/gcd*k,y1+a/gcd*k)也是解
if(t<0)//x的解得周期为b/gcd y的解的周期 a/gcd 则任意解 x 对b/gcd取模,得出最小解,取正就ok了
t=-1*t;
printf("%lld\n",(x%t+t)%t);//取模运算 带入数字,x=-5,t=3,去理解

看代码:

">long long x;long long y;
long long exgcd(long long a,long long b)
{
if(b==0)
{
x=1;
y=0;
return a;
}
long long r=exgcd(b,a%b);
long long temp=x;
x=y;
y=(temp-a/b*y);
return r;
}
int main()
{
long long n,m,l,a,b;
while(~scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l))
{
b=m-n;
a=y-x;
long long k=exgcd(b,l);
if(a%k)
printf("Impossible\n");
else
{
x=x*a/k;
long long t=l/k;//根据通解公式 (x1,y1)为一组通解,则(x1+b/gcd*k,y1+a/gcd*k)也是解
if(t<0)//x的解得周期为b/gcd y的解的周期 a/gcd 则任意解 x 对b/gcd取模,得出最小解,取正就ok了
t=-1*t;
printf("%lld\n",(x%t+t)%t);
}
}
return 0;
}

POJ - 1061 青蛙的约会 扩展欧几里得 + (贝祖公式)最小正整数解的更多相关文章

  1. poj 1061 青蛙的约会 (扩展欧几里得模板)

    青蛙的约会 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status ...

  2. Poj 1061 青蛙的约会(扩展欧几里得解线性同余式)

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

  3. POJ 1061 青蛙的约会 扩展欧几里得

    扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cs ...

  4. poj 1061 青蛙的约会 拓展欧几里得模板

    // poj 1061 青蛙的约会 拓展欧几里得模板 // 注意进行exgcd时,保证a,b是正数,最后的答案如果是负数,要加上一个膜 #include <cstdio> #include ...

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

    POJ.1061 青蛙的约会 (拓展欧几里得) 题意分析 我们设两只小青蛙每只都跳了X次,由于他们相遇,可以得出他们同余,则有: 代码总览 #include <iostream> #inc ...

  6. poj 1061 青蛙的约会+拓展欧几里得+题解

    青蛙的约会+拓展欧几里得+题解 纵有疾风起 题意 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出 ...

  7. pku 1061 青蛙的约会 扩展欧几里得

    青蛙的约会Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 120482 Accepted: 25449Description 两只青 ...

  8. POJ 1061 青蛙的约会(欧几里得扩展)

    题意:已知青蛙1位置x,速度m,青蛙2位置y,速度n,纬线长度为l,求他们相遇时最少跳跃次数. 思路:设最小跳跃次数为k,则(x + k*m) - (y + k*n) = q*l:经过整理得到k*(n ...

  9. 青蛙的约会 扩展欧几里得 方程ax+by=c的整数解 一个跑道长为周长为L米,两只青蛙初始位置为x,y;(x!=y,同时逆时针运动,每一次运动分别为m,n米;问第几次运动后相遇,即在同一位置。

    /** 题目:青蛙的约会 链接:https://vjudge.net/contest/154246#problem/R 题意:一个跑道长为周长为L米,两只青蛙初始位置为x,y:(x!=y,同时逆时针运 ...

随机推荐

  1. linux学习--2.文件管理的基本命令

    文件的基本操作 前言: 看完这篇图文我应该能保证读者在Linux系统下对文件的操作能跟用Windows环境下一样流畅吧,好了下面正文 正文: 基础知识: linux里共有以下几类文件,分别为目录(di ...

  2. Flutter调研(1)-Flutter基础知识

    工作需要,因客户端有部分页面要使用flutter编写,需要QA了解一下flutter相关知识,因此,做了flutter调研,包含安装,基础知识与demo编写,第二部分是安装与环境配置. —— Flut ...

  3. 什么是HDFS?算了,告诉你也不懂。

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 上一篇已经讲解了「大数据入门」的相关基础概念和知 ...

  4. k8s环境部署.net core web项目(docker本地仓库)

    在之前的文档中,我们部署了.net core web在k8s环境下,达成了集群管理项目的目的.但是,由于是本地部署,需要在所有的node节点都拉取好镜像,这是非常麻烦的,为了只维护一份代码,同步更新. ...

  5. Javascript Event事件中IE与标准DOM的区别

    1.事件流的区别 <body> <div> <button>点击这里</button> </div> </body> IE采用冒 ...

  6. Kubernetes-PersistentVolumeClaim(PVC)介绍

    1 PVC介绍   PVC是用户层面,作为对存储资源的需求申请,主要包括了存储空间大小.访问模式.PV的选择条件.存储类别等信息的设置. 2 PVC的参数详解 2.1 PVC的yaml模板 apiVe ...

  7. 从0开始搭建kafka客户端

    上一节,我们实现了搭建kafka集群.本节我们将从0开始,使用Java,搭建kafka客户端生产消费模型. 1.创建maven项目2.kafka producer3.kafka consumer4.结 ...

  8. angular root在css和less的写法

    背景:angular7项目,angular cli创建了一个模板 新建了一个common.css 本身modle会有一个专属的less文件 写样式 父组件下的子组件样式修改 什么情况下用:root  ...

  9. Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习)

    Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习)                                                           ...

  10. 使用 ALSAlib 播放 wav

    在 ARM 2440 开发板上正常播放 16bit  44100 采样率的wav , 为了程序简单,没有判断返回值. 补充,在 ubunto 上也能正常播放. 编译方法: arm-linux-gcc ...