#ifndef GCD_H #define GCD_H #include <cstdlib> #include <cmath> #include <algorithm> /***************************************************/ // 最大公约数_ int GCD(int x, int y) { int t; while(y > 0) { t = x % y; x = y; y = t; } return x; } /***************************************************/ // 快速gcd_ int kgcd(int a, int b) { if (a == 0) return b; if (b == 0) return a; // a,b都是偶数 if (!(a&1) && !(b&1)) return kgcd(a>>1, b>>1) << 1; // a 奇 b 偶 else if (!(b&1)) return kgcd(a, b>>1); else if (!(a&1)) return kgcd(b, a>>1); else return kgcd(abs(a - b), std::min(a, b)); } /***************************************************/ // a,n 互质,a 对 n 逆元 // ax ≡ 1 (mod n) int Inv(int a, int n) { int d, x, y; d = extended_euclid(a, n, x, y);// d = ax + ny if(d == 1) return (x%n + n) % n;// x可能为负数 else return -1; // no solution } /***************************************************/ //如果GCD(a,b) = d, 则存在x, y, 使d = ax + by // GCD(a, b) = ax + by // a,b的线性组合系数,存在x,y中,返回 GCD(a,b) // 递归式: a = bq + t // d = x'b + y't // 代入: d = x'b + y'(a - bq) // 得到 a系数 y', b系数 x' - qy' int extended_euclid(int a, int b, int &x, int &y) { int d; if(b == 0) {x = 1; y = 0; return a;} d = extended_euclid(b, a % b, y, x); y -= a / b * x; return d; } /***************************************************/ #endif // GCD_H