判断素数 $O(\sqrt n)$

bool isprime(int n) {
    if (n < 2) return false;
    for (int i = 2; i <= n / i; i ++)
        if (n % i == 0) return false;
    return true;
}

最大公约数GCD $O(log n)$

int gcd(int a, int b) {
    if (!b) return a;
    return gcd(b, a % b);
}
int lcm = (long long)a * b / gcd(a, b); // 最小公倍数

分解质因数 $O(\sqrt n)$

for (int j = 2; j <= x / j; j ++)
    while (x % j == 0) {
        cnt[j] ++;
        x /= j;
    }
if (x > 1) cnt[x] ++;

欧拉筛 $O(n)$

int primes[N / 10], f[N], cnt;
for (int i = 2; i < N; i ++) {
    if (!st[i]) primes[ ++ cnt] = i;
    for (int j = 1; i * primes[j] < N; j ++) {
        st[i * primes[j]] = true;
        if (i % primes[j] == 0) break;
    }
}

快速幂 $O(log k)$

int qmi(int a, int k) {
    int ans = 1;
    while (k) {
        if (k & 1) ans = (LL)ans * a % mod;
        k >>= 1;
        a = (LL)a * a % mod;
    }
    return ans;
}

快速幂预处理阶乘/阶乘逆元求组合数 $O(nlogn + m)$

int qmi(int a, int k) {
    int ans = 1;
    while (k) {
        if (k & 1) ans = (LL)ans * a % mod;
        k >>= 1;
        a = (LL)a * a % mod;
    }
    return ans;
}
int fact[N], infact[N];
void init(int n) {
    fact[0] = infact[0] = 1;
    for (int i = 1; i <= n; i ++) {
        fact[i] = (LL)fact[i - 1] * i % mod;
        infact[i] = qmi(fact[i], mod - 2);
    }
}
int C(int n, int m) {
    return (LL)fact[n] * infact[n - m] % mod * infact[m] % mod;
}

递推预处理阶乘/阶乘逆元求组合数 $O(n + m)$

int fact[N], inv[N], infact[N];
void init(int n) {
    fact[0] = infact[0] = fact[1] = infact[1] = inv[1] = 1;
    for (int i = 2; i <= n; i ++) {
        fact[i] = (LL)fact[i - 1] * i % mod;
        inv[i] = (mod - (LL)mod / i * inv[mod % i] % mod) % mod;
        infact[i] = (LL)infact[i - 1] * inv[i] % mod;
    }
}
int C(int n, int m) {
    return (LL)fact[n] * infact[n - m] % mod * infact[m] % mod;
}