QAQ数论模板笔记√

#include <cstdio>

using namespace std;

long long gcd(long long a, long long b) { // (a, b)
    return b ? gcd(b, a % b) : a;
}

long long exGcd(long long a, long long b, long long &x, long long &y) { // ax + by = 1
    if (b == 0) {
        x = 1, y = 0;
        return a;
    }
    long long d = exGcd(b, a % b, x, y);
    long long t = x;
    x = y;
    y = t - a / b * y;
    return d;
}

bool calcInv(long long a, long long p, long long &inv) { // Inv_a % p
    long long x, y;
    long long d = exGcd(a, p, x, y);
    if (1 % d == 0)    return inv = (x % p + p) % p, 1;
    else return 0;
}

bool calcLinear(long long a, long long b, long long c, long long &x, long long &y) { // ax + by = c
    long long _x = x, _y = y;
    long long d = exGcd(a, b, _x, _y);
    if (c % d) return 0;
    x = _x * c / d, y = _y * c / d;
    return 1;
}

class CRT { // x = ai mod mi
public :
    bool merge(long long a, long long m, long long b, long long n, long long &r, long long &p) {
        long long g = gcd(m, n);
        long long c = b - a;
        if (c % g) return 0;
        c = (c % n + n) % n;
        c /= g, m /= g, n /= g;
        long long inv; calcInv(m, n, inv);
        c *= inv, c %= n, c *= m * g, c += a;
        p = m * n * g, r = (c % p + p) % p;
        return 1;
    }

    long long calc(long long *a, long long *m, long long n) {
        long long remain = a[1], p = m[1];
        for (int i = 2; i <= n; ++ i) {
            long long _r, _p;
            if (!merge(remain, p, a[i], m[i], _r, _p)) return -1;
            remain = _r, p = _p;
        }
        return (remain % p + p) % p;
    }
} ;

template <int SIZE> class calcPrimeNumbers { // calc the prime numbers below SIZE
public :    
    int isNotPrime[SIZE + 10];
    int primes[SIZE + 10];
    int primeCnt;

    void sieve(int lim) {
        for (int i = 2; i <= lim; ++ i) {
            if (!isNotPrime[i]) primes[++ primeCnt] = i;
            for (int j = 1; j <= primeCnt && i * primes[j] <= lim; ++ j) {
                isNotPrime[i * primes[j]] = 1;
                if (i % primes[j] == 0) break ;
            }
        }
    }
} ;

long long mul(long long a, long long b, long long p) { // a * b % p;
    long long ret = 0;
    for (int i = 62; ~ i; -- i) 
        ret = (ret + ret) % p, b & (1ll << i) ? ret = (ret + a) % p : 0;
    return ret % p;
}

long long quickPower(long long a, long long b, long long p) { // a ^ b % p
    long long ret = 1;
    for ( ; b; b >>= 1, a = mul(a, a, p))
        b % 2 ? ret = mul(ret, a, p) : 0;
    return ret;
}

template <int SIZE> class gaussian { // gaussian elimination    
public :
    double mat[SIZE + 10][SIZE + 10];
    double ans[SIZE + 10];

    void gauss(int n) {
        static int id[SIZE + 10];
        for (int i = 1; i <= n; ++ i) id[i] = i;
        for (int i = 1; i <= n; ++ i) {
            int now = i;
            for ( ; now <= n; ++ now) {
                if (mat[id[now]][i] != 0) break ;
            }
            if (now == n + 1) continue ;
            swap(id[now], id[i]);
            for (int j = i + 1; j <= n; ++ j) {
                int ii = id[i], ij = id[j];
                double t = mat[ij][i] / mat[ii][i];
                for (int k = n + 1; k >= i; -- k) {
                    mat[ij][k] = mat[ii][k] * t - mat[ij][k];
                }
            }
        }
        for (int i = n; i; -- i) {
            double count = mat[id[i]][n + 1];
            for (int j = n; j > i; -- j) {
                count -= mat[id[i]][j] * ans[j];
            }
            ans[i] = count / mat[id[i]][i];
        }
    }
} ;

template <int SIZE> class calcPhi { // calc the phi
public :
    int isNotPrime[SIZE + 10], primes[SIZE + 10], primeCnt;
    int phi[SIZE + 10];

    void sieve(int lim) {
        phi[1] = 1;
        for (int i = 2; i <= lim; ++ i) {
            if (!isNotPrime[i]) {
                primes[++ primeCnt] = i;
                phi[i] = i - 1;
            }
            for (int j = 1; j <= primeCnt && i * primes[j] <= lim; ++ j) {
                isNotPrime[i * primes[j]] = 1;
                if (i % primes[j] == 0) {
                    phi[i * primes[j]] = phi[i] * primes[j];
                    break ;
                }
                else {
                    phi[i * primes[j]] = phi[i] * (primes[j] - 1);
                }
            }
        }
    }
} ;

int main() {
    return 0;
}
by yjl

  %%%yjl

原文地址:https://www.cnblogs.com/gc812/p/5795542.html