[总结] 数学

- 导语 -

 大概是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 成立。
 

- 同余 -

 相关性质:
 \(a\equiv b\pmod{m}\Rightarrow (a,m)=(b,m)\qquad (\mathit 8)\)
 \(ac\equiv bc\pmod{m},(c,m)=d\Rightarrow a\equiv b\pmod{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 1\pmod N\)
 

- 扩展欧拉定理 -

 \(a^b\equiv a^{b \%\varphi(p)+\varphi(p)}\) (mod p) ,  gcd(a, p) \(\neq\) 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_n\pmod p=C^{m/p}_{n/p}\times 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 \binom{n}{k}x^{n-k}y^k\)
 

- 容斥原理 -

 \(\left|\bigcup A_i \right|=\sum_{i=1}^n\left|A_i\right|-\sum_{i,j:1\leq i<j\leq n}\left|A_i\bigcap A_j\right|+\sum_{i,j,k:1\leq i<j<k\leq n}\left|A_i\bigcap A_j\bigcap A_k\right|-...+(-1)^{n-1}\left|A_i\bigcap ...\bigcap A_n\right|\)
 

- 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

posted @ 2017-09-12 20:24  lstttt  阅读(204)  评论(0编辑  收藏  举报