扩展欧几里得算法 POJ 1061
根据此题 整理下 扩展欧几里得
扩展欧几里得是用来判断并求 ax + by = c 是否有解及其解的数学算法
首先列出定理
1、ax + by = gcd(a,b)
2、gcd(a,b) = gcd(b, a%b);
本题 题意是 判断两个同向的青蛙 在初始位置(x,y),速度不同(m,n)的情况下能否在一个球形路线(周长为L)下相遇
也就是可以列出等式
(x + m*t)%L = (y + n*t)%L;
==> (x + m*t)%L -(y + n*t)%L =0
==> (x + m*t) -(y + n*t) + k*L =0
==> (m - n )*t + k*L = y-x
a * x + b*y = c;
判断是否有解以及解;
如果C对gcd(a,b)取余不是0那么就说明无论怎么走 都不会相遇
如果是0
说明有解 带入扩展欧几里得算法求解
我们对 ax + by = c 化简 根据定理2
ax + by = gcd (a,b) = gcd (b,a%b) = bx +(a%b) *y = c = ...
当化简到最后也就是 b = 0时候 原式可以表示成 a*x + 0*y = gcd(a,0) = a
此时也就是说 ==> x=1,y = 0;
求得一个关于a*x +0*y = gcd(a,0) = a的解
ax' + by'
= bx + (a%b) *y
= bx + (a - a/b*b ) *y
= bx + ay- a/b*by
= ay + b(x-a/b*y)
也就是说 当前ab下的解
通过下一层递归的x和y求出
x' = y
y' = (x-a/b*y)
于是可以写出扩展欧几里得算法
当递归回溯回来的时候 我们就得到了 ax' + by' = gcd(a,b)的解
ll egcd(ll a,ll b,ll &x,ll &y)
{if(b==0) {x = 1,y = 0;return a;}ll ans = egcd(b,a%b,x,y);ll t = x;x = y;y = t-a/b*y;return ans;
}
可是问题还没解决 我们要求的是等于C的解我们现在得到了gcdab的一组解,这就需要我们进一步转化答案
设t = C/gcd(a,b)
可以将 ax + by = c = a * t *x + b * t *y = gcd(a,b) *t
也就是 我们得到的解 的X值 也就是时间值 再乘以 t 就是对应C 下的x解
然后得到解后有可能解是负数 那么需要我们进一步找通解
通解公式
x = x0 + k * ( b / gcd(a,b) )
y = y0 + k * ( a / gcd(a,b) )
最终可以获得最小正整数解
例题 POJ 1061
code:
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <functional>
#include <vector>
#include <cmath>
#include <string>
#include <stack>
#include <queue>
using namespace std;
typedef long long ll;
ll egcd(ll a,ll b,ll &x,ll &y)
{if(b==0){x = 1,y = 0;return a;}ll ans = egcd(b,a%b,x,y);ll t = x;x = y;y = t-a/b*y;return ans;
}
int main()
{ll x,y,m,n,L;cin>>x>>y>>m>>n>>L;ll a,b,c;a = m-n;b = L;c = y-x;if(a<0){a = -a;c = -c;}ll gcd = egcd(a,b,x,y);cout<<egcd(x,y,a,b)<<endl;if(c%gcd!=0)puts("Impossible");else{x = x*c/gcd;ll t = b/gcd;if(x>=0)x %=t;elsex = x%t+t;}return 0;
}
==> (x + m*t)%L -(y + n*t)%L =0
扩展欧几里得算法 POJ 1061相关推荐
- POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)
POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法) 手动博客搬家: 本文发表于20180226 23:35:26, 原地址https://blog.csdn ...
- POJ 2142: 扩展欧几里得算法
POJ 2142: The Balance Description Data 思路 扩展欧几里得算法 线性组合 Code --扩展欧几里得算法 原题传送门 Description Ms. Iyo Ki ...
- 扩展欧几里得算法_扩展欧几里得递推算法
欧几里得算法 表示 整数 a 与 b 的最大公约数. 若 t = a % b, 则 证明略. 递推版 gcd 算法 gcd 接受变量元组 (a, b) 作为输入,输出最大公约数 (r). 我们很难直接 ...
- 欧几里得算法扩展欧几里得算法
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). ...
- 如何利用扩展欧几里得算法求解不定方程_客户端不用的算法系列:从头条笔试题认识扩展欧几里得算法...
难度较高,阅读时间大概 28 分钟 这是数论的第二篇,在<素数筛法>中,我们重温了素数这个数学定义,并且给出了区别于教科书上更高效的 Eratosthenes 筛法和欧拉线性筛.这篇文会从 ...
- Codeforces 1106F Lunar New Year and a Recursive Sequence (数学、线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...
Codeforces 1106F Lunar New Year and a Recursive Sequence (数学.线性代数.线性递推.数论.BSGS.扩展欧几里得算法) 哎呀大水题..我写了一 ...
- GCD LCM 欧几里得算法 扩展欧几里得算法
欧几里得算法: 辗转相除法的关键恒等式:gcd(a,b)=gcd(b,a mod b); 边界条件:gcd(a,0)=a; //最大公约数 int gcd(int a,int b) {return b ...
- 欧几里得算法和扩展欧几里得算法(Euclidean_Algorithm and Extended_Euclidean_Algorithm)
一.基本概念 欧几里得算法:又名辗转相除法,计算两个整数a,b的最大公约数. 扩展欧几里得算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ...
- 2018/7/31 -zznu-oj -问题 C: 磨刀- 【扩展欧几里得算法的基本应用】
问题 C: 磨刀 时间限制: 1 Sec 内存限制: 128 MB 提交: 190 解决: 39 [提交] [状态] [讨论版] [命题人:admin] 题目描述 磨刀是一个讲究的工作,只能在n℃ ...
最新文章
- 互联网运营期产品评审杂思,互联网营销
- react-native 使用 antd-mobile-rn UI进行开发app
- 爱思唯尔云论坛:疫情挑战下的大数据与人工智能研究
- 南开大学计算机本科论文,南开大学本科毕业论文设计-南开大学教务处主页.DOC...
- ControlStyles(枚举)
- Spring框架----四种常用通知类型
- 怎样输出矩阵乘积C语言,c语言矩阵相乘
- 如何搭建一对一直播PHP直播系统源码的流程
- 十三天学会C语言笔记
- 基于STM32HAL库ADS1256调试笔记
- 房子装饰风水有哪些讲究和忌讳
- windows10系统超全优化方法
- 截止9月10日苹果审核指南中文版
- ping的各种意义、作用
- 非对称加密实战(一):JDK生成keystore获取公钥私钥及代码验证【附源码】
- 17-7PH不锈钢(SUS 631)用于哪些领域
- mac提示dns错误如何解决
- 【达内课程】ListView使用
- jep使用_JEP 374:禁用和弃用偏向锁定
- 二叉树的递归算法到底该怎么理解?
热门文章
- 真机调试及上线简略流程
- JAVA可阻塞队列-ArrayBlockingQueue
- Bootstrap中过渡效果(Transition)模态框插件的使用案例
- 【编程题目】给你 10 分钟时间,根据上排给出十个数,在其下排填出对应的十个数...
- SharePoint【学习笔记】-- SharePoint 2010 技术参数整理
- 串口开发,数据类型转换——字符串转 byte[],byte[]转二进制,二进制转十进制转byte[],byte[]转十进制,byte[]拼接,校验
- ie9 Flash内容无法显示
- matlab builder for java下载,Matlab Builder JA - Compile Matlab into a Java jar - Free Version?
- java 组合对象_Java 中组合模型之对象结构模式的详解
- Idea 封装Java代码片段 快速提示