gcd,扩展gcd
2017-09-01 16:52
204 查看
欧几里得算法
int gcd(int a,int b){ return b==0?a:gcd(b,a%b); }
扩展欧几里得
一个结论:ax+by的最小正整数等于gcd(a,b);如何求出ax+by=gcd(a,b)的解呢?
例如 60x+36y = gcd(60,36)
模拟一下gcd过程
序号 a b
1 60 36 1*36+24
2 36 24 1*24+12
3 24 12 2*12+0
我们令 a = 60 b=36。
1 60=1*36+24 即 a=b+24 =》 24 = a-b
2 36=1*24+12 即 b=(a-b)+12 =》 12=2b-a
所以 2b-a=12 即x=-1,y=2是 60x+36y=gcd(60,36)的一组解。
代码
typedef __int64 ll; void ex_gcd(ll a, ll b, ll& d, ll& x, ll &y) { if(!b) { d = a, x = 1, y = 0; } else { ex_gcd(b, a % b, d, y, x); y -= x * (a / b); } }
求出x,y的一组解(x1,y1)之后,根据线性方程定理,可得任意解(x1+k*b/gcd(a,b),y1-k*a/gcd(a,b)),其中k为任意整数。
相关文章推荐
- ACM_欧几里得(GCD) 扩展欧几里得(EXGCD)
- poj 1061 青蛙的约会(扩展gcd)
- sgu 140 Integer Sequences 扩展GCD
- gcd及扩展gcd
- POJ 2115 C Looooops 扩展gcd
- 扩展gcd
- poj 2891 Strange Way to Express Integers (扩展gcd)
- NYOJ 144 小珂的苦恼【扩展gcd】
- 【扩展GCD】
- 最大公约数gcd算法及其扩展
- 扩展gcd
- poj 1060---青蛙的约会 【扩展GCD】
- sgu 141 Jumping Joe 扩展GCD
- 扩展GCD
- SGU 106 The equation (扩展GCD/多特判)
- uva 12169 扩展Gcd
- 扩展gcd 以及线性同余模方程
- 用GCD的方式,加载网络图片(主线程加载图片+类扩展方式)
- POJ 1061 青蛙的约会 【扩展GCD】
- POJ 1061 扩展gcd 线性同余方程