1. 辗转相除法/欧几里得算法
gcd(a, b) = gcd(b, a%b)
算法实现
int gcd(int a, int b){
if(b == 0)
return a;
return gcd(b, a % b);
}
2. 扩展辗转相除法
于是,可以在求得满足bx' + a%b*y' = gcd(b, a%b)的x'和y'之后再继续求出x和y,当b = 0时, x = 1, y = 0即可返回。
算法实现
//返回a和b的最大公约数,同时返回时的x和y满足 ax + by = gcd(a, b)
int extgcd(int a, int b, int& x, int& y){
if (b == 0){
x = 1;
y = 0;
return a;
}
int d = extgcd(b, a % b, y, x);
y -= (a/b)*x;
return d;
}
3. 模运算
a x b = c x d(mod m)
4. 快速幂算法
i。
long long mod_pow(long long x, long long n, long long m){
long long res = 1;
while(n > 0){
if (n & 1)
res = res * x % m;
x = x * x % m;
n >= 1;
}
return res;
}
5. 矩阵的幂
typedef vector<int> vec;
typedef vector<vec> mat;
typedef long long int ll;
const int M = 10000;
//计算 A*B
mat mul(mat& A, mat& B){
mat C(A.size(), vec(B[0].size()));
for(int i = 0; i < A.size(); i ++){
for(int k = 0; k < B.size(); k ++){
for(int j = 0; j < B[0].size(); j ++){
C[i][j] = (C[i][j] + A[i][k]*B[k][j]) % M;
}
}
}
return C:
}
//计算A^n
mat pow(mat A, ll n){
mat B(A.size(), vec(A.size()));
for(int i = 0; i < A.size(); i ++){
B[i][i] = 1;
}
while(n > 0){
if (n & 1)
B = mul(B, A);
A = mul(A, A)
n >= 1;
}
return B;
}