描述
欧几里德算法
别名:辗转相除法
用途:计算两个正整数a,b的最大公约数
欧几里德拓展算法
扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足等式:
ax+by=gcd(a,b)=d(解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。
代码
C++ 欧几里德LL gcd (LL a, LL b) {
ret...
分类:
其他好文 时间:
2014-07-03 16:20:26
阅读次数:
198
最短路径问题就是给定一个图,这个图中的边是有方向和权重的。求s到t的最短路径。
最短路径问题其实分为很多种。按照起点和终点来分,可以分为:
从一个顶点到另一个顶点
从一个顶点到其他所有顶点
从所有顶点到所有顶点
按照边的权重来分可以分为:
非负权
任意权
欧几里德权
按照是否有环可以分为
...
分类:
其他好文 时间:
2014-06-25 08:36:29
阅读次数:
149
目前已经介绍了Kruskal和Prim算法,他们的复杂度一个是E logE一个是E logV,那么有没有复杂度为E的算法呢?理论上是可能的,但是目前还没有发现该算法。下图是最小生成树算法的发展过程。
从图中可以看到复杂度越來越接近E。
最小生成树的应用
欧几里德最小生成树
问题描述:给定一系列点的坐标,求包含所有点...
分类:
其他好文 时间:
2014-06-21 20:35:44
阅读次数:
368
解法:直接上模版。
扩展欧几里德的模版:
typedef long long LL;
LL ex_gcd(LL a,LL b,LL &x,LL &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
LL d=ex_gcd(b,a%b,x,y);
LL t=x;
x=y;...
分类:
其他好文 时间:
2014-06-08 16:56:35
阅读次数:
228
双调欧几里得旅行商问题是一个经典动态规划问题。《算法导论(第二版)》思考题15-1和北京大学OJ2677都出现了这个题目。
旅行商问题描述:平面上n个点,确定一条连接各点的最短闭合旅程。这个解的一般形式为NP的(在多项式时间内可以求出)
J.L. Bentley 建议通过只考虑双调旅程(bitonictour)来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后...
分类:
其他好文 时间:
2014-06-05 04:28:09
阅读次数:
220
CSDN链接两个自然数的积等于这两个数的最大公约数与最小公倍数的积。求最大公约数的方法:1、辗转相除法:辗转相除法又称为欧几里德算法其计算原理依赖于下面的定理:定理:gcd(a,b)
= gcd(b,a mod b) (a>b 且a mod b 不为0)当b==0时,gcd(a,b)中的a即为最大公...
分类:
其他好文 时间:
2014-05-26 11:19:49
阅读次数:
263
uva 10104 Euclid Problem (数论-扩展欧几里德)
题目大意:
已知 A 和 B , 问你 A*X+B*Y=GCD(A,B)的 X,Y解。
解题思路:
非常裸的拓展欧几里德算法。
拓展欧几里德算法证明过程:
因为 B*X1+A%B*Y1=GCD(B,A%B) =GCD(A,B)=A*X+B*Y
所以 B*X1+(A-A/B*B)*Y1=A*X+B*Y
A*Y1+B*(X1-A/B*Y1)=A*X+B*Y
于是: X=Y1,Y=(X1-A/B*Y1)
因此,得出( A*...
分类:
其他好文 时间:
2014-05-26 05:53:55
阅读次数:
297
题目:Modified LCS
为过此题去仔细研究了下扩展欧几里德算法,领悟了一些精华。
模板为:
void gcd(ll a, ll b, ll& d, ll& x, ll& y)
{
if(!b) {d = a; x = 1; y = 0;}
else{ gcd(b, a%b, d, y, x); y -= x*(a/b);}
}
这里算出来的x,y是对于方...
分类:
其他好文 时间:
2014-05-23 00:26:20
阅读次数:
377
Description
两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面...
分类:
其他好文 时间:
2014-05-22 17:35:34
阅读次数:
214
SOL : 扩展的欧几里德, ax+by==c
x=x0+b/d*t;
y=y0-a/d*t;
求|x|+|Y|的最小值
可以发现:
|x0+b/d*t| 单调递增 |y0-a/d*t| 单调递减
因为 a>b,所以就是说函数是凹的,先减小后增大。
显然 当y0-a/d*t==0的时候 |x|+|Y| 最小值就在那附近。
枚举几个值就能找到。
#in...
分类:
其他好文 时间:
2014-05-21 09:25:41
阅读次数:
290