欧几里德算法与扩展(中国剩余定理)
2016-08-18 17:19
309 查看
1.欧几里德算法(最大公约数)
int gcd(int a,int b){
if(!b)
return a;
else
return gcd(b,a%b);
}
最小公倍数=a*b/gcd(a,b)
2.扩展欧几里德算法
该算法用于求二元一次方程:a*x+b*y=c;
原理:(1)a*x+b*y=gcd(a,b)一定有解,要想求出(2)a*x+b*y=c的解,必须满足c%gcd(a,b)==0, 结果为:方程(1)的解为x0,y0,则方程(2)的解为x=x0*c/gcd(a,b),y=y0*c/gcd(a,b);
注意:1. (x+k*b,y-k*a),都为方程(2)的解,k为任意值。
2. 最小非负解为:(x0 * (c / gcd(a,b)) % b + b) % b;
核心代码:
int gcd(int a,int b){
if(!b)
return a;
else
return gcd(b,a%b);
}
最小公倍数=a*b/gcd(a,b)
2.扩展欧几里德算法
该算法用于求二元一次方程:a*x+b*y=c;
原理:(1)a*x+b*y=gcd(a,b)一定有解,要想求出(2)a*x+b*y=c的解,必须满足c%gcd(a,b)==0, 结果为:方程(1)的解为x0,y0,则方程(2)的解为x=x0*c/gcd(a,b),y=y0*c/gcd(a,b);
注意:1. (x+k*b,y-k*a),都为方程(2)的解,k为任意值。
2. 最小非负解为:(x0 * (c / gcd(a,b)) % b + b) % b;
核心代码:
void ext_gcd(ll a,ll b,ll c,ll &x,ll &y) //a*x+b*y=c { if(!b) {c=a;x=1;y=0;return;} ext_gcd(b,a%b,c,y,x); y-=a/b*x; }
相关文章推荐
- 扩展欧几里德算法 线性同余方程 中国剩余定理
- 扩展欧几里德算法 线性同余方程 中国剩余定理
- [Codeforces688D]Remainders Game(扩展中国剩余定理)
- codeforces 710D Two Arithmetic Progressions (扩展中国剩余定理)
- [CF338D]GCD Table(扩展中国剩余定理)
- [HDU1573]X问题(扩展中国剩余定理)
- [poj2891]Strange Way to Express Integers(扩展中国剩余定理)
- 扩展欧几里德算法 线性同余方程 中国剩余定理
- [BZOJ 1407][NOI 2002]Savage(中国剩余定理+扩展欧几里得)
- 扩展的欧几里得&中国剩余定理
- 扩展欧几里德算法 线性同余方程 中国剩余定理 (转载)
- [POJ2891]Strange Way to Express Integers(扩展中国剩余定理)
- [Codeforces710D]Two Arithmetic Progressions(扩展中国剩余定理)
- 欧几里德算法及其扩展和中国剩余定理(暂时先写到这)
- [Codeforces338D]GCD Table(扩展中国剩余定理)
- 学习笔记:中国剩余定理(CRT)及扩展中国剩余定理
- Codeforces 688D. Remainders Game (扩展中国剩余定理)
- 洛谷P4774 BZOJ5418 LOJ2721 [NOI2018]屠龙勇士(扩展中国剩余定理)
- codeforces 338D GCD Table (扩展中国剩余定理)
- 中国剩余定理+扩展