POJ - 1061 青蛙的约会 扩展欧几里得 + (贝祖公式)最小正整数解
题意:
青蛙 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 青蛙的约会 扩展欧几里得 + (贝祖公式)最小正整数解的更多相关文章
- poj 1061 青蛙的约会 (扩展欧几里得模板)
青蛙的约会 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status ...
- Poj 1061 青蛙的约会(扩展欧几里得解线性同余式)
一.Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要 ...
- POJ 1061 青蛙的约会 扩展欧几里得
扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cs ...
- poj 1061 青蛙的约会 拓展欧几里得模板
// poj 1061 青蛙的约会 拓展欧几里得模板 // 注意进行exgcd时,保证a,b是正数,最后的答案如果是负数,要加上一个膜 #include <cstdio> #include ...
- POJ.1061 青蛙的约会 (拓展欧几里得)
POJ.1061 青蛙的约会 (拓展欧几里得) 题意分析 我们设两只小青蛙每只都跳了X次,由于他们相遇,可以得出他们同余,则有: 代码总览 #include <iostream> #inc ...
- poj 1061 青蛙的约会+拓展欧几里得+题解
青蛙的约会+拓展欧几里得+题解 纵有疾风起 题意 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出 ...
- pku 1061 青蛙的约会 扩展欧几里得
青蛙的约会Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 120482 Accepted: 25449Description 两只青 ...
- POJ 1061 青蛙的约会(欧几里得扩展)
题意:已知青蛙1位置x,速度m,青蛙2位置y,速度n,纬线长度为l,求他们相遇时最少跳跃次数. 思路:设最小跳跃次数为k,则(x + k*m) - (y + k*n) = q*l:经过整理得到k*(n ...
- 青蛙的约会 扩展欧几里得 方程ax+by=c的整数解 一个跑道长为周长为L米,两只青蛙初始位置为x,y;(x!=y,同时逆时针运动,每一次运动分别为m,n米;问第几次运动后相遇,即在同一位置。
/** 题目:青蛙的约会 链接:https://vjudge.net/contest/154246#problem/R 题意:一个跑道长为周长为L米,两只青蛙初始位置为x,y:(x!=y,同时逆时针运 ...
随机推荐
- linux学习--2.文件管理的基本命令
文件的基本操作 前言: 看完这篇图文我应该能保证读者在Linux系统下对文件的操作能跟用Windows环境下一样流畅吧,好了下面正文 正文: 基础知识: linux里共有以下几类文件,分别为目录(di ...
- Flutter调研(1)-Flutter基础知识
工作需要,因客户端有部分页面要使用flutter编写,需要QA了解一下flutter相关知识,因此,做了flutter调研,包含安装,基础知识与demo编写,第二部分是安装与环境配置. —— Flut ...
- 什么是HDFS?算了,告诉你也不懂。
前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 上一篇已经讲解了「大数据入门」的相关基础概念和知 ...
- k8s环境部署.net core web项目(docker本地仓库)
在之前的文档中,我们部署了.net core web在k8s环境下,达成了集群管理项目的目的.但是,由于是本地部署,需要在所有的node节点都拉取好镜像,这是非常麻烦的,为了只维护一份代码,同步更新. ...
- Javascript Event事件中IE与标准DOM的区别
1.事件流的区别 <body> <div> <button>点击这里</button> </div> </body> IE采用冒 ...
- Kubernetes-PersistentVolumeClaim(PVC)介绍
1 PVC介绍 PVC是用户层面,作为对存储资源的需求申请,主要包括了存储空间大小.访问模式.PV的选择条件.存储类别等信息的设置. 2 PVC的参数详解 2.1 PVC的yaml模板 apiVe ...
- 从0开始搭建kafka客户端
上一节,我们实现了搭建kafka集群.本节我们将从0开始,使用Java,搭建kafka客户端生产消费模型. 1.创建maven项目2.kafka producer3.kafka consumer4.结 ...
- angular root在css和less的写法
背景:angular7项目,angular cli创建了一个模板 新建了一个common.css 本身modle会有一个专属的less文件 写样式 父组件下的子组件样式修改 什么情况下用:root ...
- Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习)
Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习) ...
- 使用 ALSAlib 播放 wav
在 ARM 2440 开发板上正常播放 16bit 44100 采样率的wav , 为了程序简单,没有判断返回值. 补充,在 ubunto 上也能正常播放. 编译方法: arm-linux-gcc ...