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;
}

 

 

相关文章: