算法学习链接+学习小结

#序言:
博主是个蒟蒻…各类链接跟归纳,
如果有什么问题,可以在留言区询问,
勿喷哦,%%%dalao

【---------------------------------】

0.csdn数学符号:
#传送门

【---------------------------------】
1.树链剖分:
#传送门1

#传送门2

【---------------------------------】
2.组合数各类性质,定理:
#传送门1

【---------------------------------】
3.位运算:

(1)取出整数N在二进制表示下的第K位:(N>>K) & 1
(2)取出整数N在二进制表示下的第0~K-1位(后K位):N &((1<<K)-1)
(3)把整数N在二进制表示下的第K位取反:N xor (1<<K)
(4)对整数N在二进制表示下的第K位赋值1:N | (1<<K)
(5)对整数N在二进制表示下的第K位赋值0:N & (~(1<<K))

【---------------------------------】
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,b1a,bN,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 ab,则,
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 ab,则,
a = q ∗ b + r a = q * b + r a=qb+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 qb

因为 d d d ∣ | q ∗ b q * b qb d d d ∣ | a a a
所以可得 d d d ∣ | ( a − q ∗ b a-q*b aqb)
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 b b的公约数集合是相同的
因此,我们可以知道他们的最大公约数相同,
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)
【---------------------------------】
8.拓展欧几里德算法:
贝祖定理:
对 于 任 意 a , b , 存 在 一 对 整 数 x , y , 满 足 a x + b y = g c d ( a , b ) 对于任意a,b,存在一对整数x,y,满足ax+by =gcd(a,b) a,bx,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 a1+00=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 bx+(ab ⌊ a / b ⌋ ) ∗ y = \left \lfloor a/b \right \rfloor )*y= a/b)y=
a ∗ y − b ( − x + a *y-b(-x+ ayb(x+ ⌊ a / b ⌋ ∗ y ) = \left \lfloor a/b \right \rfloor*y)= a/by)=
a ∗ y + b ( x − a *y+b(x- ay+b(x ⌊ a / b ⌋ ∗ y ) \left \lfloor a/b \right \rfloor*y) a/by)

此时我们可以令,
x ′ = y x'=y x=y
y ′ = x − y'=x- y=x ⌊ a / b ⌋ ∗ y \left \lfloor a/b \right \rfloor*y a/by
则显然能得到,
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)=dng(d)<>g(n)=dnf(n/d)μ(d)
证明:
g ( n ) = ∑ d ∣ n f ( n / d ) μ ( d ) g(n)=\sum_{d|n}f(n/d)μ(d) g(n)=dnf(n/d)μ(d)
= ∑ d ∣ n μ ( d ) ∑ k ∣ ( n / d ) g ( k ) =\sum_{d|n}μ(d)\sum_{k|(n/d)}g(k) =dnμ(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) =kng(k)d(n/k),dnμ(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) =kng(k)d(n/k)μ(d)
因为
n = 1 n=1 n=1, ∑ d ∣ n μ ( n ) = 1 \sum_{d|n}μ(n)=1 dnμ(n)=1
n ≠ 1 n≠1 n=1, ∑ d ∣ n μ ( n ) = 0 \sum_{d|n}μ(n)=0 dnμ(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)=ndg(d)<>g(n)=ndμ(d/n)f(d)
证明:
g ( n ) = ∑ n ∣ d μ ( d / n ) f ( d ) g(n)=\sum_{n|d}μ(d/n)f(d) g(n)=ndμ(d/n)f(d)
= ∑ n ∣ d μ ( d / n ) ∑ d ∣ k g ( k ) =\sum_{n|d}μ(d/n)\sum_{d|k}g(k) =ndμ(d/n)dkg(k)
= ∑ n ∣ k g k ∑ d ∣ k , n ∣ d μ ( d / n ) =\sum_{n|k}g_k\sum_{d|k,n|d}μ(d/n) =nkgkdk,ndμ(d/n)
k = s ∗ n , d = c ∗ n k=s*n,d=c*n k=sn,d=cn
因为 d ∣ k d|k dk,所以有 c ∣ s c|s cs,则
= ∑ n ∣ k g k ∑ c ∣ s μ ( c ) =\sum_{n|k}g_k\sum_{c|s}μ(c) =nkgkcsμ(c)
因为
n = 1 n=1 n=1, ∑ d ∣ n μ ( n ) = 1 \sum_{d|n}μ(n)=1 dnμ(n)=1
n ≠ 1 n≠1 n=1, ∑ d ∣ n μ ( n ) = 0 \sum_{d|n}μ(n)=0 dnμ(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 gn1=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 φ(ij)=φ(j)i i ∣ j i|j ij
证明:
j = k ∗ i j=k*i j=ki
则若 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=p1a1p2a2...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=kp1a1p2a2...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) φ(ij)=ijπi=1l((pl1)/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((pl1)/pl)=φ(j)
那么 φ ( i ∗ j ) = φ ( j ) ∗ i φ(i*j)=φ(j)*i φ(ij)=φ(j)i


inline ll ksc(ll x,ll y,ll mod)
{
    return (x*y-(ll)((long double)x/mod*y)*mod+mod)%mod;     
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值