zoukankan      html  css  js  c++  java
  • [总结] 数学

    - 导语 -

     大概是noip的程度...
     数学真的是...难以理解且知识点多且容易忘...

     

    - 快速幂 -

    LL pow_mod(LL a, LL b, LL p){
        LL ret = 1;
        while(b) {
            if(b & 1) ret = (ret * a) % p;
            a = (a * a) % p; b >>= 1;
        }
        return ret;
    }
    

     

    - 最大公约数与最小公倍数 -

     最大公约数(a, b)
     最小公倍数[a, b]

    LL gcd(LL a, LL b) {
        return a % b == 0 ? b : gcd(b, a % b);
    }
    

     

    - 扩展欧几里得 -

    ll ex_gcd(ll a, ll b, ll &x, ll &y) {
    	if (!b) {
    		x = 1; y = 0;
    		return a;
    	}
    	ll fx, fy;
    	ll g = ex_gcd(b, a % b, fx, fy);
    	x = fy;
    	y = fx - (a / b) * fy;
    	return g;
    }
    

     

    - 算数基本定理 -

     一个大于 1 的正整数都能分解成质因数乘积的形式,并且如果把质因数按照由小到大的顺序排列在一起,相同的质因数的积写成幂的形式,那么这种分解方法是唯一的。并且,正整数 N 最多只含一个超过根号 N 的质因子。
     (N=p^{k1}_1*p^{k2}_2*p^{k3}_3*p^{k4}_4...)
     (N=prod p^{ki}_i)
     (N) 的所有约数个数为(prod (ki+1))
     (N) 的所有约数之和为(prod cfrac {1-{P_i^{ki}}}{1-{P_i}})
     (约数和=(p^0_1+p^1_1+p^2_1...p^{k1}_1)*(p^0_2+p^{1}_2+p^{2}_2...p^{k2}_2)*(p^0_3+p^{1}_3+p^{2}_3...p^{k3}_3)*(p^0_4+p^{1}_4+p^{2}_4...p^{k4}_4)...)
     

    - 裴蜀定理 -

     裴蜀定理 若 a,b 是整数,且(a,b)=d,那么对于任意的整数 x,y,ax+by 都一定是 d 的倍数,特别地,一定存在整数 x,y,使 ax+by=d 成立。
     

    - 同余 -

     相关性质:
     (aequiv bpmod{m}Rightarrow (a,m)=(b,m)qquad (mathit 8))
     (acequiv bcpmod{m},(c,m)=dRightarrow aequiv bpmod{m/d}qquad (mathit 9))
     

    - 欧拉函数 -

     (对于正整数 k ,令函数 varphi (k)的值等于在[1,k]之中所有与 k 互质的个数,称 varphi ( k ) 为 Euler 函数,或 Euler — varphi 函数。)
     (varphi(n)=n(1-frac {1}{p_1})(1-frac {1}{p_2})...(1-frac {1}{p_n})=n prod_{p|n}(1-frac {1}{p}))
     

    - 欧拉定理 -

     设 (m) 是正整数,((a,m) = 1),则 (a^{varphi(m)}equiv 1 pmod m)
     
     欧拉定理的简要证明:
     设长度为 (varphi(N))的数列 (A) 中每个数代表的都是在([1,N])之中与 (N) 互质的数,若得出数列 (B) 为数列 (A) 中每个数乘以 (a)。则数列 (B) 中每个数对于 (N) 均不同余(见同余性质 (9)),而且数列 (B) 中每个数对 (N) 的模值均与 (N) 互质。则 (B) 中每个元素对于 (N) 的模值与数列 (A) 中的元素一一对应,所以 (A) 中每个数的乘积等于 (B) 中每个数的乘积,也就是:
     ((a*A_1)*(a*A_2)*(a*A_3)*(a*A_4)...equiv A_1*A_2*A_3*A_4...pmod N)
     (a^{varphi(N)}*A_1*A_2*A_3*A_4...equiv A_1*A_2*A_3*A_4...pmod N)
     (a^{varphi(N)}equiv 1pmod N)
     

    - 扩展欧拉定理 -

     (a^bequiv a^{b \%varphi(p)+varphi(p)}) (mod p) ,  gcd(a, p) ( eq) 1 且 b > (varphi(p))
     

    - 费马小定理 -

     设 (p) 是素数,则对于任意的整数 (a) ,有(a^p equiv a pmod p), 其实就是欧拉定理在对质数取模时的特殊情况。
     

    - 威尔逊定理 -

     当且仅当 (p) 为素数时:((p-1)! equiv -1 pmod p),证明参见欧拉函数。
     

    - 排列 -

     定义: 从 n 个不同元素中取出 m(m≤n)个元素,按照一定的顺序排成一列,叫做从 n 个元素中取出 m 个元素的一个排列。
     公式: (A_n^m= cfrac{N!}{N-M!})
     基础递推:

    for (int i = 1; i <= m; ++i) {
    	A[i][0] = 1;
    	for (int j = 1; j <= i; ++j) {
    		A[i][j] = A[i][j - 1] * (i - j + 1) % MOD;
    	}
    }
    A[0][0] = 1;
    

     

    - 组合 -

     定义: 从 n 个不同元素中取出 m(m≤n)个元素,构成一个集合,叫做从 n 个元素中取出 m 个元素的一个组合。
     公式: (C_n^m= cfrac{N!}{M!(N-M)!}=C_{n}^{n-m}=C_{n-1}^{m-1}+C_{n-1}^{m})
     把阶乘预处理出来似乎可以解决到1e6(模数)???

    void init_fac(int mod)  
    {  
        FAC[0] = 1;  
        for (int i = 1; i < mod; i++)
            FAC[i] = FAC[i-1] * i % mod;
        inv[mod-1] = pow_mod(FAC[mod-1], mod-2, mod);
        for (int i = mod - 2; i >= 0; --i) 
            inv[i] = inv[i + 1] * (i + 1) % mod;
    }  
    
    LL get_c(LL n, LL m)  
    {  
        if (m > n) return 0;  
        return FAC[n] * (get_inv(FAC[m] * FAC[n-m], mod)) % mod;
    }  
    

    - lucas 定理 -

    (C^m_npmod p=C^{m/p}_{n/p} imes C^{m\%p}_{n\%p} pmod p)
    不会证也不想学略略略
    用于处理n, m比较大而p不超过1e5的情况.

    LL ans_c(LL x, LL y) {//get_inv求逆元, get_fac求阶乘
    	if (y < x) return 0;
    	if (!x || y == x) return 1;
    	if (x == 1) return y % mod;
    	return get_fac(y) * get_inv(get_fac(x)) % mod * get_inv(get_fac(y - x)) % mod;	
    }
    
    LL lucas(LL x, LL y) {
    	if (y < x) return 0;
    	if (!x || y == x) return 1;
    	if (x == 1) return y % mod;
    	return ans_c(x % mod, y % mod) * lucas(x / mod, y / mod) % mod;	
    }
    

    - 逆元 Inverse-

    该板块参考: http://www.cnblogs.com/linyujun/p/5194184.html

    飞马小定理(仅适用于 p 为质数)

    LL pow_mod(LL a, LL b, LL p){//a的b次方求余p 
        LL ret = 1;
        while(b) {
            if(b & 1) ret = (ret * a) % p;
            a = (a * a) % p; b >>= 1;
        }
        return ret;
    }
    LL fermat(LL a, LL p){//飞马求a关于p的逆元 
        return pow_mod(a, p-2, p);
    }
    

    扩欧
    概括:
    对于互质的 (a, b, 若有 a*x+b*y=1), (x) 就是( a 对于 b 的逆元, y 是 b 对于 a 的逆元.)
    两边同时模上 (b, a) 即可证明.

    LL ex_gcd(LL a, LL b,LL &x, LL &y) {
    	if (!b) {
    		x = 1; y = 0;
    		return a;
    	}
    	LL fx, fy;
    	LL g = ex_gcd(b, a % b, fx, fy);
    	x = fy;
    	y = fx - (a / b) * fy;
    	return g;
    }
    LL inv(LL a, LL p){//求 a 关于 p 的逆元,如果不存在,返回-1 
        LL gcd, x, y;
        gcd = ex_gcd(a, p, x, y);
        return gcd == 1 ? (x % p + p) % p : -1;
    }
    

    O(n)线性推
    证明: http://blog.miskcoo.com/2014/09/linear-find-all-invert

    #include<cstdio>
    int init_inv(){//求1到N-1的逆元
        inv[1] = 1;
        for(int i = 2; i < N; i ++){
            inv[i] = (p - p / i) * 1ll * inv[p % i] % p;
        }
    }
    

    或单个求:

    LL inv(LL t, LL p) { //求t关于p的逆元, 因为t要小于p, t已经模过p了 
        return t == 1 ? 1 : (p - p / t) * inv(p % t, p) % p;
    }
    

    阶乘与逆元

    void(int MAXN, LL mod) { //求 0! 到 MAXN! 的逆元
        FAC[0] = FAC[1] = 1;
        for (int i = 2; i <= MAXN; i++)
            FAC[i] = FAC[i - 1] * i % mod;
        INV[MAXN] = pow_mod(FAC[MAXN], mod - 2);
        for (int i = MAXN - 1; i >= 0; i--)
            INV[i] = INV[i + 1] * (i + 1) % mod;
    }
    

    - catalan 数 -

     Catalan数的定义令h(1)=1,Catalan数满足递归式:h(n) = h(1)h(n-1) + h(2)h(n-2) + ... + h(n-1)h(1),n>=2该递推关系的解为:h(n) = C(2n-2,n-1)/n,n=1,2,3,...(其中C(2n-2,n-1)表示2n-2个中取n-1个的组合数)
     

    - 二项式定理 -

     ((x+y)^n=sum_{k=0}^n inom{n}{k}x^{n-k}y^k)
     

    - 容斥原理 -

     (left|igcup A_i ight|=sum_{i=1}^nleft|A_i ight|-sum_{i,j:1leq i<jleq n}left|A_iigcap A_j ight|+sum_{i,j,k:1leq i<j<kleq n}left|A_iigcap A_jigcap A_k ight|-...+(-1)^{n-1}left|A_iigcap ...igcap A_n ight|)
     

    - Fibonacci -

     (F(1)=1,F(2)=1,F(n+2)=F(n)+F(n-1))
     性质:
     (1.F(1)+F(2)+...+F(n)=F(n+2)-1)
     (2.F^2(1)+F^2(2)+...+F^2(n)=F(n)*F(n+1))
     (3.F(1)+F(3)+...+F(2n-1)=F(2n))
     ( F(2)+F(4)+...+F(2n)=F(2n+1))
     证明及更多式子:https://wenku.baidu.com/view/d42d74e9cfc789eb172dc8f4.html

  • 相关阅读:
    [转]Android输入法框的梳理
    [转]Android中OptionMenu的使用
    [转] Android把view的画面转换为bitmap
    Health Level Seven International (HL7)
    [转]andriod的apk文件相关的编译反编译工具
    [转]Android优秀开源项目收集
    而立之年 独立自主
    [转]Android模拟键盘和键盘监听的一些调研
    [转] linux中如何能在DDMS中打开真机中的数据库
    [转]关于使用SurfaceFligner进行绘图的具体实现方法
  • 原文地址:https://www.cnblogs.com/Anding-16/p/7512036.html
Copyright © 2011-2022 走看看