poj1061 青蛙的约会 扩展欧几里得
2013-06-14 16:37
369 查看
中文题
思路: 扩展欧几里得
扩展欧几里得
给定整数a 和 b, 且满足 a*x1 + b*y1 = gcd(a, b), 求解x, y.
当 b == 0 的时候, gcd(a, b) = a. 此时x = 1, y = 0.
当a*b != 0的时候, 推理: 根据欧几里得可知, gcd(a, b) = gcd(b, a%b). 那么 a*x1 + b*y1 = b*x2 + a%b*y2
化解上式得到 b*x2 + (a - (a/b)*b)*y2 = a*y2 + b*x2 - (a/b)*b*y2.
而根据恒等定理可知: x1 = y2, y1 = x2 - a/b*y2 ,由此我们可以知道求得x1, x2 的结果是基于x2, y2 而得到的, 因此我们只需要不断的递归下去,即:
gcd(a, b) =gcd(b, a%b)=gcd(a%b, b%(a%b)) 直到b == 0 返回x2, y2 的结果, 通过恒等定理求得x1, y1.
对于方程a*x1 + b*y1 = c , 我们可以根据上面求得的方程 a*x1 + b*y1 = gcd(a, b)转换得到(设d = gcd(a, b)).
a*x1 + b*y1 = d 转换得到: a(x1*c/d) + b(y1*c/d) = c.
因此方程的解为x = x1*c/d, y = y1*c/d.
构建方程:
(x + m* t) % L = (y + n*t) % L
转换得到:
x + m*t = y + n*t + w*L;
(n - m)*t + w*L = x - y;
即扩展欧几里得:a*x + b*t = c
View Code
思路: 扩展欧几里得
扩展欧几里得
给定整数a 和 b, 且满足 a*x1 + b*y1 = gcd(a, b), 求解x, y.
当 b == 0 的时候, gcd(a, b) = a. 此时x = 1, y = 0.
当a*b != 0的时候, 推理: 根据欧几里得可知, gcd(a, b) = gcd(b, a%b). 那么 a*x1 + b*y1 = b*x2 + a%b*y2
化解上式得到 b*x2 + (a - (a/b)*b)*y2 = a*y2 + b*x2 - (a/b)*b*y2.
而根据恒等定理可知: x1 = y2, y1 = x2 - a/b*y2 ,由此我们可以知道求得x1, x2 的结果是基于x2, y2 而得到的, 因此我们只需要不断的递归下去,即:
gcd(a, b) =gcd(b, a%b)=gcd(a%b, b%(a%b)) 直到b == 0 返回x2, y2 的结果, 通过恒等定理求得x1, y1.
对于方程a*x1 + b*y1 = c , 我们可以根据上面求得的方程 a*x1 + b*y1 = gcd(a, b)转换得到(设d = gcd(a, b)).
a*x1 + b*y1 = d 转换得到: a(x1*c/d) + b(y1*c/d) = c.
因此方程的解为x = x1*c/d, y = y1*c/d.
构建方程:
(x + m* t) % L = (y + n*t) % L
转换得到:
x + m*t = y + n*t + w*L;
(n - m)*t + w*L = x - y;
即扩展欧几里得:a*x + b*t = c
#include <iostream> using namespace std; long long extended_gcd(long long a, long long b, long long &x, long long &y) { long long ret , tmp; if (b == 0) { x = 1, y = 0; return a; } ret = extended_gcd(b, a%b, x, y); tmp = x; x = y; y = tmp - a /b *y; return ret; } int main() { long long x, y, d, X, Y, n, m, L; /* x + m*t = y + n*t + w*L; (n - m)*t + w*L = x - y; 扩展欧几里得:a*x + b*t = b */ while (cin>>x>>y>>m>>n>>L) { d = extended_gcd(n-m, L, X, Y); if ((x - y) % d != 0) cout<<"Impossible"<<endl; else cout<<((x - y) / d * X % L + L) % L<<endl; } }
View Code
相关文章推荐
- Poj 1061 青蛙的约会(扩展欧几里得解线性同余式)
- POJ-1061 青蛙的约会(扩展欧几里得)
- poj 1061 青蛙的约会 (扩展欧几里得模板)
- poj1061青蛙的约会(扩展欧几里得)
- Poj 1061:青蛙的约会(扩展欧几里得)
- Poj 1061 青蛙的约会(扩展欧几里得)
- POJ - 1061 青蛙的约会(扩展欧几里得)
- [ACM] POJ 1061青蛙的约会(扩展欧几里得求模线性方程)
- poj 1061 青蛙的约会 (扩展欧几里得)
- POJ 1061青蛙的约会(扩展欧几里得)
- POJ 1061:青蛙的约会_扩展欧几里得
- Poj 1061 青蛙的约会(扩展欧几里得解线性同余式)
- POJ 1061 青蛙的约会(扩展欧几里得)
- 再论扩展欧几里得—POJ 1061 青蛙约会
- poj 1061 青蛙的约会 【扩展欧几里得】
- poj1061青蛙的约会 扩展欧几里得
- Poj 1061 青蛙的约会(扩展欧几里得解线性同余式)
- poj 1061 青蛙的约会 扩展欧几里得
- poj-1061-青蛙的约会【扩展欧几里得】
- 【POJ 1061】青蛙的约会(扩展欧几里得)