- 导语 -
大概是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