#序言:
博主是个蒟蒻…各类链接跟归纳,
如果有什么问题,可以在留言区询问,
勿喷哦,%%%dalao
【---------------------------------】
0.csdn数学符号:
#传送门
【---------------------------------】
1.树链剖分:
#传送门1
#传送门2
【---------------------------------】
2.组合数各类性质,定理:
#传送门1
【---------------------------------】
3.位运算:
(1)取出整数N在二进制表示下的第K位:(N>>K) & 1
(2)取出整数N在二进制表示下的第0~K-1位(后K位):N &((1<
【---------------------------------】
4.树状数组:
#传送门1
【---------------------------------】
5.欧拉函数:
#传送门1
#传送门2
【---------------------------------】
6.FFT:
#传送门1
【---------------------------------】
7.欧几里德算法:
对 于 任 意 a , b , 1 ≤ a , b ≤ N , b ≠ 0 对于任意a,b,1≤a,b≤N,b≠0 对于任意a,b,1≤a,b≤N,b̸=0
则 g c d ( a , b ) gcd(a,b) gcd(a,b) = = = g c d ( b , a gcd(b,a gcd(b,a m o d mod mod b ) b) b)
证明:
① 当 a ≤ b a ≤ b a≤b,则,
g c d ( b , a gcd(b,a gcd(b,a m o d mod mod b ) b ) b) = = = g c d ( b , a ) gcd(b,a) gcd(b,a) = g c d ( a , b ) gcd(a,b) gcd(a,b)
② 当 a ≥ b a ≥ b a≥b,则,
设 a = q ∗ b + r a = q * b + r a=q∗b+r,显然 r = a r = a r=a m o d mod mod b b b。
对于 a , b a,b a,b的任意一个公约数d,
显然可得出,
d d d ∣ | ∣ a a a 且 d d d ∣ | ∣ b b b
因为 d d d ∣ | ∣ b b b,所以可得 d d d ∣ | ∣ q ∗ b q * b q∗b
因为 d d d ∣ | ∣ q ∗ b q * b q∗b 且 d d d ∣ | ∣ a a a
所以可得 d d d ∣ | ∣ ( a − q ∗ b a-q*b a−q∗b)
即 d d d ∣ | ∣ r r r,
即 d d d ∣ | ∣ ( a a a m o d mod mod b b b)
所以证出,
a , b a,b a,b的公约数集合,与 b , a b,a b,a m o d mod mod $ b 的 公 约 数 集 合 是 相 同 的 因 此 , 我 们 可 以 知 道 他 们 的 最 大 公 约 数 相 同 , 即 的公约数集合是相同的 因此,我们可以知道他们的最大公约数相同, 即 的公约数集合是相同的因此,我们可以知道他们的最大公约数相同,即gcd(a,b)$ = = = g c d ( b , a gcd(b,a gcd(b,a m o d mod mod b ) b) b)
【---------------------------------】
8.拓展欧几里德算法:
贝祖定理:
对 于 任 意 a , b , 存 在 一 对 整 数 x , y , 满 足 a x + b y = g c d ( a , b ) 对于任意a,b,存在一对整数x,y,满足ax+by =gcd(a,b) 对于任意a,b,存在一对整数x,y,满足ax+by=gcd(a,b)
证明:
①当 b = 0 b=0 b=0时,显然有一对整数解x = 1,y = 0,使其满足
即 a ∗ 1 + 0 ∗ 0 = g c d ( a , 0 ) = a a * 1 + 0 * 0 = gcd(a,0) = a a∗1+0∗0=gcd(a,0)=a
ps:任意正整数x, g c d ( x , 0 ) = g c d ( 0 , x ) = x gcd(x,0) = gcd(0,x)= x gcd(x,0)=gcd(0,x)=x
②当 b > 0 b>0 b>0时,
因为 g c d ( a , b ) = g c d ( b , a gcd(a,b) = gcd(b,a gcd(a,b)=gcd(b,a m o d mod mod b ) b) b) (在第7点时已证
所以当存在一对整数解x,y
满足
$b * x + (a $ m o d mod mod b ) ∗ y = b)*y = b)∗y= g c d ( b , a gcd(b,a gcd(b,a m o d mod mod b ) b) b)
由于
$b * x + (a $ m o d mod mod b ) ∗ y = b)*y = b)∗y=
b ∗ x + ( a − b b *x+(a-b b∗x+(a−b ⌊ a / b ⌋ ) ∗ y = \left \lfloor a/b \right \rfloor )*y= ⌊a/b⌋)∗y=
a ∗ y − b ( − x + a *y-b(-x+ a∗y−b(−x+ ⌊ a / b ⌋ ∗ y ) = \left \lfloor a/b \right \rfloor*y)= ⌊a/b⌋∗y)=
a ∗ y + b ( x − a *y+b(x- a∗y+b(x− ⌊ a / b ⌋ ∗ y ) \left \lfloor a/b \right \rfloor*y) ⌊a/b⌋∗y)
此时我们可以令,
x ′ = y x'=y x′=y
y ′ = x − y'=x- y′=x− ⌊ a / b ⌋ ∗ y \left \lfloor a/b \right \rfloor*y ⌊a/b⌋∗y
则显然能得到,
a x ′ + b y ′ = g c d ( a , b ) ax'+by'=gcd(a,b) ax′+by′=gcd(a,b)
所以我们可以在求解gcd的过程中运用数学归纳法,
可以知道贝祖定理成立。
【---------------------------------】
9.高斯消元:
#传送门1
【---------------------------------】
10.莫比乌斯反演:
#传送门1
f ( n ) = ∑ d ∣ n g ( d ) < − > g ( n ) = ∑ d ∣ n f ( n / d ) μ ( d ) f(n)=\sum_{d|n} g(d) <->g(n)=\sum_{d|n}f(n/d)μ(d) f(n)=∑d∣ng(d)<−>g(n)=∑d∣nf(n/d)μ(d)
证明:
g ( n ) = ∑ d ∣ n f ( n / d ) μ ( d ) g(n)=\sum_{d|n}f(n/d)μ(d) g(n)=∑d∣nf(n/d)μ(d)
= ∑ d ∣ n μ ( d ) ∑ k ∣ ( n / d ) g ( k ) =\sum_{d|n}μ(d)\sum_{k|(n/d)}g(k) =∑d∣nμ(d)∑k∣(n/d)g(k)
= ∑ k ∣ n g ( k ) ∑ d ∣ ( n / k ) , d ∣ n μ ( d ) =\sum_{k|n}g(k)\sum_{d|(n/k),d|n}μ(d) =∑k∣ng(k)∑d∣(n/k),d∣nμ(d)
因为 g c d ( n / k , n ) = n / k gcd(n/k,n)=n/k gcd(n/k,n)=n/k,则
= ∑ k ∣ n g ( k ) ∑ d ∣ ( n / k ) μ ( d ) =\sum_{k|n}g(k)\sum_{d|(n/k)}μ(d) =∑k∣ng(k)∑d∣(n/k)μ(d)
因为
n = 1 n=1 n=1, ∑ d ∣ n μ ( n ) = 1 \sum_{d|n}μ(n)=1 ∑d∣nμ(n)=1
n ≠ 1 n≠1 n̸=1, ∑ d ∣ n μ ( n ) = 0 \sum_{d|n}μ(n)=0 ∑d∣nμ(n)=0
则
当且仅当 n / k = 1 n/k=1 n/k=1时对 g n g_n gn会产生贡献
则 k = n k=n k=n才对答案有贡献,
贡献仅有 g ( n ) ∗ 1 = g n g(n)*1=g_n g(n)∗1=gn,得证
【---------------------------------】
f ( n ) = ∑ n ∣ d g ( d ) < − > g ( n ) = ∑ n ∣ d μ ( d / n ) f ( d ) f(n)=\sum_{n|d}g(d)<->g(n)=\sum_{n|d}μ(d/n)f(d) f(n)=∑n∣dg(d)<−>g(n)=∑n∣dμ(d/n)f(d)
证明:
g ( n ) = ∑ n ∣ d μ ( d / n ) f ( d ) g(n)=\sum_{n|d}μ(d/n)f(d) g(n)=∑n∣dμ(d/n)f(d)
= ∑ n ∣ d μ ( d / n ) ∑ d ∣ k g ( k ) =\sum_{n|d}μ(d/n)\sum_{d|k}g(k) =∑n∣dμ(d/n)∑d∣kg(k)
= ∑ n ∣ k g k ∑ d ∣ k , n ∣ d μ ( d / n ) =\sum_{n|k}g_k\sum_{d|k,n|d}μ(d/n) =∑n∣kgk∑d∣k,n∣dμ(d/n)
设 k = s ∗ n , d = c ∗ n k=s*n,d=c*n k=s∗n,d=c∗n,
因为 d ∣ k d|k d∣k,所以有 c ∣ s c|s c∣s,则
= ∑ n ∣ k g k ∑ c ∣ s μ ( c ) =\sum_{n|k}g_k\sum_{c|s}μ(c) =∑n∣kgk∑c∣sμ(c)
因为
n = 1 n=1 n=1, ∑ d ∣ n μ ( n ) = 1 \sum_{d|n}μ(n)=1 ∑d∣nμ(n)=1
n ≠ 1 n≠1 n̸=1, ∑ d ∣ n μ ( n ) = 0 \sum_{d|n}μ(n)=0 ∑d∣nμ(n)=0
则
当且仅当 s = 1 s=1 s=1时对 g n g_n gn会产生贡献
则 k = n k=n k=n才对答案有贡献,
贡献仅有 g n ∗ 1 = g n g_n*1=g_n gn∗1=gn,得证
【---------------------------------】
11.set
set t —— 定义一个int类型的容器,注意set里的每个元素只会出现1次
t.insert(k) —— 插入元素k,多次插入同一个元素后面无效
t.count(k) —— 判断元素k是否在容器内
t.erase(k) —— 删除元素k,若不存在则删除无效
t.clear() —— 清空容器
t.size() —— 返回容器现有元素个数
t.empty() —— 判断容器是否为空
想遍历set里的元素或进行进一步修改,必须定义对应迭代器,以下三种定义方法(迭代器类似于指针)
set::iterator it —— 定义正向迭代器
set::reverse_iterator rit; —— 定义反向迭代器
auto it = t.begin(); —— 因t.begin()返回正向迭代器,所以it自动被定义为正向迭代器,可适应其他所有操作
以下需要迭代器的操作:
t.begin() —— 返回set中第一个元素,类型为正向迭代器
t.rbegin() —— 返回set中最后一个元素,类型为反向迭代器
t.end() —— 返回set中最后一个元素,类型为正向迭代器
t.rend() —— 返回set中第一个元素,类型为反向迭代器
t.find(k) —— 寻找k,若找到返回对应的迭代器,否则返回end();
t.insert(a, b) —— 插入指针[a, b)之间的元素,已有元素不会再次插入
t.erase(it) —— 删除迭代器it对应的元素
t.erase(l, r) —— 删除迭代器[l, r)之间的元素
lower_bound(k) —— 返回第一个大于等于k的元素的迭代器
upper_bound(k) —— 返回第一个大于k的元素的迭代器
【---------------------------------】
12.cdp分治:
#传送门1
13.逆元:
当p是个质数的时候有
inv(a) = (p - p / a) * inv(p % a) % p
证明:
14.快速乘:
inline ll ksc(ll x, ll y, ll P){
ll L=x*(y>>25)%P*(1<<25)%P;
ll R=x*(y&((1<<25)-1))%P;
return (L+R)%P;
}
15.欧拉函数.
φ ( i ∗ j ) = φ ( j ) ∗ i φ(i*j)=φ(j)*i φ(i∗j)=φ(j)∗i当 i ∣ j i|j i∣j时
证明:
令 j = k ∗ i j=k*i j=k∗i,
则若 i = p 1 a 1 ∗ p 2 a 2 ∗ . . . ∗ p c a c i=p_1^{a_1}*p_2^{a_2}*...*p_{c}^{a_c} i=p1a1∗p2a2∗...∗pcac
那么 j = k ∗ p 1 a 1 ∗ p 2 a 2 ∗ . . . ∗ p c a c j=k*p_1^{a_1}*p_2^{a_2}*...*p_{c}^{a_c} j=k∗p1a1∗p2a2∗...∗pcac
φ ( i ∗ j ) = i ∗ j ∗ π i = 1 l ( ( p l − 1 ) / p l ) φ(i*j)=i*j*π_{i=1}^{l}((p_l-1)/p_l) φ(i∗j)=i∗j∗πi=1l((pl−1)/pl)
因为对于i的素因子,必定被j包含,而j中的因子k,将k素因数分解以后的p与i中的p不同的值则是j素因数分解下与i不同的p部分
那么对于i*j的素因子而言,显然种类就是等于j的素因子
则 j ∗ π i = 1 l ( ( p l − 1 ) / p l ) = φ ( j ) j*π_{i=1}^{l}((p_l-1)/p_l)=φ(j) j∗πi=1l((pl−1)/pl)=φ(j)
那么 φ ( i ∗ j ) = φ ( j ) ∗ i φ(i*j)=φ(j)*i φ(i∗j)=φ(j)∗i