1)欧几里得
Gcd(a,b)=Gcd(b,a%b)
注解:递归,循环也行,a=Gcd(a,0)
2) 扩展欧几里得
有 Ax + By = D
A,B,D已知,当且仅当gcd(A,B)|D(即D%gcd(A,B)=0)时,x,y有整数解
I.典型同余模问题
问题链接:http://poj.org/problem?id=2115
题意:
for (variable = A; variable != B; variable += C)statement;
以上变量均为k位unsigned integer type (int为32位),会给出A.B.C.k,让你求这个循环运行多少次,如果是死循环,输出Forever.
题解:
(A+x*C)%2^k=B
x有解,x即为答案;
x无解,输出Forever.
进行同余模转化:
(A+x*C)%2^k=B%2^k……①
Cx+y*2^k=B-A……②
②式就很明显了,若gcd(C,2^k)|B-A,则答案有解
怎么求这个解呢?可用如下算法求出一个特解
int exgcd(int a, int b, int &x, int &y) {
if(b == 0) {
x = 1;
y = 0;
return a;
}
int r = exgcd(b, a % b, x, y);
int t = x; x = y; y = t - a / b * y;
return r;
}
ps:关于这个算法的推导与欧几里得定理有关(难怪叫扩展欧几里得)
然后由特解求出通解:
x=x0+k(b/gcd(a,b));
y=y0+k(a/gcd(a,b));
这里的k为任意整数
最后,最小正整数解就是答案了