【算法笔记】acm数学基础

来源:互联网 发布:mysql无法创建用户 编辑:程序博客网 时间:2024/06/05 07:54
// gcd拓展 an + bm = gcd(a, b)int ext_gcd(int &a, int n, int &b, int m){    if (m == 0) {        a = 1; b = 0;        return n;    }    int d = ex_gcd(b, m, a, n%m);    b -= n / m * a;    return d;}

模运算

// 利用用裴蜀恒等式求逆元// a = 1(mod p) -> ax + py = 1// 逆元不存在返回-1 getInverse(LL a, LL p) {    LL d, x, y;    d = ext_gcd(x, a, y, p);    if (d == 1) return -1;    return x < 0 ? x+p : x;}
// 快速幂取模 javapublic long fast_pow_mod(long x, int n) {        long ret = 1;        while (n > 0) {            if ( (n&1) != 0 ) ret = ret * x % Mod;            n >>= 1;            x = x * x % Mod;        }        return ret;    }
// a = 1 (mod P),当P为素数时,利用费马小定理求逆元int inv = fast_pow_mod(a, P-2);

///////// 组合数 ////////////
求解Ckn mod P
如果n较小,n <=5000,直接利用帕斯卡三角形打表。
利用等式(nk)=nk(n1k1),时间复杂度为O(n)

// 求解C(n, k)k = min (k, n-k);       // 取计算量较少的一边long ans = 1;           // C(n-k, 0)long long x = 1, y = 1;long xs = 1, xt = k;long ys = n-k+1, yt = n;// (n-k+1)/1 * (n-k+2)/2 * ... * n/kfor (long i = xs;i <= xt;++ i) x = x * i % Mod;for (long i = ys;i <= yt;++ i) y = y * i % Mod;ans = y * fast_pow_mod (x, Mod-2) % Mod;
0 0