POJ1061-青蛙的约会---扩展欧几里德算法求最小整数解
扩展欧几里得算法模板
#include <cstdio>
#include <cstring>
#define ll long long using namespace std; ll extend_gcd(ll a, ll b, ll &x, ll &y)
{
if(b == )
{
x = , y = ;
return a;
}
else
{
ll r = extend_gcd(b, a%b, y, x);
y -= x*(a/b);
return r;
}
}
1.对于形如a*x0 + b*y0 = n的不定方程为了求解x0和y0,可以通过扩展欧几里得先求出满足a*x + b*y = gcd(a, b)的x和y。
2.容易得到,若(x-y)%gcd(a,b)==0,则该不定方程有整数解,否则无符合条件的整数解。
3.得到x和y后,可以通过x0 = x*n / gcd(a, b)这个x0相当关键,求出x0.
4.在实际问题当中,我们需要的往往是最小整数解,我们可以通过下面的方法求出最小整数解:
令t = b/gcd(a, b),x是方程a*x + b*y = n的一个特解,则xmin = (x % t + t) % t
青蛙的约会
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 113227 | Accepted: 23091 |
Description
我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。
Input
Output
Sample Input
1 2 3 4 5
Sample Output
4 分析:
#include "cstdio"
#include "iostream"
using namespace std;
#define LL long long
LL extgcd(LL a,LL b,LL&x,LL&y)///模板
{
if(b==){
x=;y=;
return a;
}
LL ans=extgcd(b,a%b,y,x);
y-=a/b*x;
return ans;
} int main()
{
LL n,m,t,l,x,y,p;
while(~scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l))
{
LL ans=extgcd(n-m,l,t,p);
if((x-y)%ans){///1.
printf("Impossible\n");
}
else
{
///求最小整数解的算法
t=(x-y)/ans*t;///首先令x为一个特解 2.
LL temp=(l/ans);
t=(t%temp+temp)%temp;///再根据公式计算 3.
printf("%lld\n",t);
}
}
}
总结:对于此类题,
我们需要做的是,1.看懂公式熟记公式
2.吸收这份来自数学的伟大力量
POJ1061-青蛙的约会---扩展欧几里德算法求最小整数解的更多相关文章
- POJ1061青蛙的约会(扩展欧几里德算法)
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 102239 Accepted: 19781 Descript ...
- POJ-1061青蛙的约会,扩展欧几里德求逆元!
青蛙的约会 以前不止一次看过这个题,但都没有去补..好吧,现在慢慢来做. 友情提示 ...
- poj1061 青蛙的约会 扩展欧几里德的应用
这个题解得改一下,开始接触数论,这道题目一开始是看了别人的思路做的,后来我又继续以这种方法去做题,发现很困难,学长告诉我先看书,把各种词的定义看懂了,再好好学习,我做了几道朴素的欧几里德,尽管是小学生 ...
- POJ1061——青蛙的约会(扩展欧几里德)
青蛙的约会 Description两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件 ...
- 青蛙的约会 (ax+by=c求最小整数解)【拓展欧几里得】
青蛙的约会(点击跳转) 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住 ...
- poj1061青蛙的约会 (扩展欧几里德)
Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事 ...
- POJ - 1061 扩展欧几里德算法+求最小正整数解
//#pragma comment(linker, "/STACK:1024000000,1024000000") //#pragma GCC optimize(2) #inclu ...
- POJ1061 青蛙的约会 —— 扩展gcd
题目链接:https://vjudge.net/problem/POJ-1061 青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submi ...
- 解题报告:poj1061 青蛙的约会 - 扩展欧几里得算法
青蛙的约会 writer:pprp Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 119716 Accepted: 25238 ...
随机推荐
- linux 操作之一 如何在linux将本地数据*.sql文件导入到linux 云服务器上的mysql数据库
liunx 版本ubuntu 16.4 mysql 版本 5.6 1)准备*.sql文件 (* 是准备导入的sql文件的名字) 2)liunx 远程客户端 SecureCRT 7.0 alt+p ...
- windows 10 下的linux子系统用法 -- tmux分屏工具用法
1 激活linux子系统的方法见百度: 2 打开powershell,输入bash启动子系统终端:输入exit退出: 3 输入tmux attach连接会话:ctrl-b+d 返回终端:ctrl-b+ ...
- Vue一些重要的知识点
vue sync修饰(1)双向数据绑定,父子组件之间信息的交互 1⃣️在自组件中使用this.emmit('toFather'),子组件产生一个tofather事件,然后在父组件中通过@进行监听,那么 ...
- linux常用命令补充详细
1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限)查看目录信息等等 常用参数搭配: ls -a 列出目录所有文 ...
- sqlserver2012 查询远程数据库
EXEC sp_addlinkedserver 'LinkName','','SQLOLEDB','121.43.177.236'EXEC sp_addlinkedsrvlogin 'LinkName ...
- web开发速查表(php,css,html5........)
- JDK源码分析 – Integer
Integer类的申明 public final class Integer extends Number implements Comparable<Integer> { … } Int ...
- [GitHub] - Unity Timer
https://github.com/akbiggs/UnityTimer#unity-timer Run actions after a delay in Unity3D. This library ...
- vue2.0中动画
#vue2.0中css动画不显示的坑: transition中包含的两个标签如果相同(此处都是p标签),需要为元素指定key.如果标签名不同的话,不指定key也可以出现动画效果. #vue2.0中js ...
- [剑指Offer] 37.数字在排序数组中出现的次数
题目描述 统计一个数字在排序数组中出现的次数. [思路]因为是排序数组,所以可以用二分法搜索到要查找的值在数组中的一个位置,接着向两侧扫描,遇到不等的就停止. class Solution { pub ...