poj 1061 (扩展欧几里德算法)
首先先抛出一个例题:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 89761 | Accepted: 16131 |
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
涉及知识点:ext_gcd
代码如下:
#include<stdio.h> #include<math.h> #define LL long long LL extend_gcd(LL a, LL b, LL &x, LL &y) { if(b==0) { x = 1; y = 0; return a; } LL d = extend_gcd(b, a%b, x, y); LL t = x; x = y; y = t-a/b*y; return d; } int main() { LL x, y, n, m, L; LL a,b,c,d; while(~scanf("%lld%lld%lld%lld%lld", &x, &y, &m, &n, &L)) { LL p,q; a=n-m, b=L, c = x-y; d = extend_gcd(a, b, p, q); if(c%d!=0) printf("Impossible\n"); else { p = p*(c/d); p = (p%b + b)%b; printf("%lld\n", p); } } return 0;
注意:
ext_gcd模板求得的只是 当 ax + by = gcd(a,b)时,x 和 y 的值。 但是当ax ' + b y' = c 如果有解,则应满足以下情况:,c能够整除gcd(a, b),也就是c = k *(gcd(a, b)) 其中k为整数。那么此时的 x' 就等于kx, y' 就等于 ky,即 x' = kx, y = ky',对应文中代码部分为: p = p*(c/d);。如果想求最小正整数解的话,就要加上
p = (p%b + b)%b 了。
—————————————————————————————————————————————————————————————————————————————
今天看了一下gcd算法,本来学的教材上有这个,但不知道还叫欧几里德算法,于是又重新看了一边,搜的时候没想到还有新的收获,又看到了拓展欧几里德算法。
先说一下gcd吧,也叫辗转相除法。给定两个数 a,b , 求两个数中的最大公约数。
int gcd(int n, int m) // n>m
{
if(n%m == 0)
return m;
else
return (m, n%m);
}
思路比较简单,两个数(a, b,其中a>b)的最大公约数就等于其中较小数(b)和(a%b)这两个数的最大公约数。
最小公倍数等于 两个数的乘积除以两个数的最大公约数。
—————————————————————————————————————————————————————————————————————————————
再说一下extend_gcd( 拓展欧几里得算法),ext_gcd 算法由裴蜀定理中得出:
知识点: 在数论中,裴蜀等式或裴蜀定理是一个关于最大公约数(或最大公约式)的定理。裴蜀定理得名于法国数学家艾蒂安·裴蜀,说明了对任何整数、和它们的最大公约数,关于未知数和的线性丢番图方程(称为裴蜀等式):
有整数解时当且仅当m是d 的倍数。裴蜀等式有解时必然有无穷多个整数解,每组解、都称为裴蜀数,可用扩展欧几里得算法求得。
例如,12和42的最大公约数是6,则方程有解。事实上有(-3)×12 + 1×42 = 6及4×12 + (-1)×42 = 6。
特别来说,方程 有整数解当且仅当整数a和b互素。
裴蜀等式也可以用来给最大公约数定义:其实就是最小的可以写成形式的正整数。这个定义的本质是整环中“理想”的概念。因此对于多项式整环也有相应的裴蜀定理。
历史:历史上首先证明关于整数的裴蜀定理的并不是裴蜀,而是17世纪初的法国数学家克劳德-加斯帕·巴歇·德·梅齐里亚克(Claude-Gaspard Bachet de Méziriac)。他在于1624年发表的著作《有关整数的令人快乐与惬意的问题集》(Problèmes plaisans et délectables qui se font par les nombres)第二版中给出了问题的描述和证明[1]。
然而,裴蜀推广了梅齐里亚克的结论,特别是探讨了多项式中的裴蜀等式,并给出了相应的定理和证明[2]。
证明过程如下:
整数中的裴蜀定理
对任意两个整数、,设是它们的最大公约数。那么关于未知数和的线性丢番图方程(称为裴蜀等式):有整数解(x,y) 当且仅当m 是d 的倍数。裴蜀等式有解时必然有无穷多个解。
如果 和 中有一个是0,比如,那么它们两个的最大公约数是。这时裴蜀等式变成,它有整数解(x,y) 当且仅当m 是d 的倍数,而且有解时必然有无穷多个解,因为 可以是任何整数。定理成立。
以下设 和 都不为0。
设,下面证明中的最小正元素是 与 的最大公约数。
首先, 不是空集(至少包含 和),因此由于自然数集合是良序的, 中存在最小正元素。考虑A中任意一个正元素p()对 的带余除法:设,其中q 为正整数,。但是
因此 ,。也就是说,A中任意一个正元素p都是 的倍数,特别地:、。因此 是 和 的公约数。
另一方面,对 和 的任意正公约数,设、,那么
因此 。所以 是 和 的最大公约数。
在方程中,如果,那么方程显然有无穷多个解:
- 。
相反的,如果有整数解,那么,于是由前可知(即)。
m=1时,方程有解当且仅当a、b互质。方程有解时,解的集合是
- 。其中是方程的一个解,可由辗转相除法得到。
所有解中,有且仅有一个解(x,y) 满足,。
拓展欧几里德算法:见链接 http://zh.wikipedia.org/wiki/%E6%89%A9%E5%B1%95%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E7%AE%97%E6%B3%95