[总结] 数学
- 导语 -
大概是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