它咕掉了
它咕掉了
高 斯 消 元 \Large{高斯消元} 高斯消元
普通版:略
模质数:求逆
模合数:exgcd
逆 矩 阵 \Large{逆矩阵} 逆矩阵
A A − 1 = I = [ 1 0 ⋯ 0 0 1 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ 1 ] AA^{-1}=I=\left[ \begin{matrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \\ \end{matrix} \right] AA−1=I=⎣⎢⎢⎢⎡10⋮001⋮0⋯⋯⋱⋯00⋮1⎦⎥⎥⎥⎤
怎么求:高斯消元,左边消元的过程中对应修改右边的矩阵。
有何用:解一个或多个形如 A ⋅ x = b A\cdot x=b A⋅x=b的方程(两边同时乘上 A − 1 A^{-1} A−1) b b b为向量
多个也可理解为解 A ⋅ x = B A\cdot x=B A⋅x=B的方程。 B B B为矩阵
[ 例 1 ] 一个图有 n n n ( ≤ 500 \le500 ≤500) 个点,有 k k k个关键点,求对所有的 ( i , j ) (i,j) (i,j),从关键点 i i i出发随机游走,到达的第一个另外的关键点是 j j j的概率。
矩 阵 快 速 幂 \Large{矩阵快速幂} 矩阵快速幂
[ 例 2 ] UOJ #200 【CTSC2016】NOIP十合一
行 列 式 \Large{行列式} 行列式
A = [ a b c d e f g h i ] A=\left[\begin{array}{} a & b & c \\ d & e & f \\ g & h & i \end{array}\right] A=⎣⎡adgbehcfi⎦⎤
D = ∣ A ∣ = d e t ( A ) = ∣ a b c d e f g h i ∣ D=|A|=det(A)=\left|\begin{array}{} a & b & c \\ d & e & f \\ g & h & i \end{array}\right| D=∣A∣=det(A)=∣∣∣∣∣∣adgbehcfi∣∣∣∣∣∣
d e t ( A ) = ∑ σ ∈ S n det(A)=\sum_{\sigma \in S_n} det(A)=∑σ∈Snff
d e t ( A B ) = d e t ( A ) ⋅ d e t ( B ) det(AB)=det(A)\cdot det(B) det(AB)=det(A)⋅det(B) " A B AB AB"是矩阵乘法
余子式: M i j M_{ij} Mij=除去i行j列的行列式
k阶主子式:选 k k k行 k k k列(标号一样)拿出来组成的 k × k k×k k×k的行列式
代数余子式: C i j = ( − 1 ) i + j ⋅ M i j C_{ij}=(-1)^{i+j}\cdot M_{ij} Cij=(−1)i+j⋅Mij
→ d e t ( A ) = C i j ⋅ a i j \to det(A)=C_{ij}\cdot a_{ij} →det(A)=Cij⋅aij
怎么求:高斯消元
n n n个 n n n维向量组成的单纯形超空间体积值为: d e t ⋅ 1 n ! det\cdot \frac{1}{n!} det⋅n!1
如三维体积为 V = 1 6 ∣ x 1 y 1 z 1 x 2 y 2 z 2 x 3 y 3 z 3 ∣ V=\frac{1}{6}\left|\begin{array}{} x1 & y1 & z1 \\ x2 & y2 & z2 \\ x3 & y3 & z3 \end{array}\right| V=61∣∣∣∣∣∣x1x2x3y1y2y3z1z2z3∣∣∣∣∣∣
矩 阵 树 定 理 \Large{矩阵树定理} 矩阵树定理
矩阵 K K K=度数矩阵 D D D-邻接矩阵 A A A
求 d e t ( K ) det(K) det(K)的任何一个 n − 1 n-1 n−1阶主子式的值都是是生成树的个数。
若有向图,则:
A i j A_{ij} Aij表示i到j的边的相反数, G i i G_{ii} Gii表示i的入度,行列式 d e t ( K ) det(K) det(K)的 M i i M_{ii} Mii表示以 i i i为根的外向树数。
A i j A_{ij} Aij表示i到j的边的相反数, G i i G_{ii} Gii表示i的出度,行列式 d e t ( K ) det(K) det(K)的 M i i M_{ii} Mii表示以 i i i为根的内向树数。
B E S T 定 理 \Large{BEST定理} BEST定理
设 e c ( G ) ec(G) ec(G)表示欧拉路径的数量, d e g ( v ) deg(v) deg(v)表示点 v v v的入度(入度和出度要相等), t s ( G ) {t}_{s}(G) ts(G)表示以 s s s点为根的外向树的个数。有 e c ( G ) = t s ( G ) ∏ v ∈ V ( d e g ( v ) − 1 ) ! \large ec(G)=t_s(G)\prod_{v\in V}(deg(v)-1)! ec(G)=ts(G)∏v∈V(deg(v)−1)!
带 状 矩 阵 \Large{带状矩阵} 带状矩阵
带状矩阵即在矩阵A中,所有的非零元素都集中在以主对角线为中心的带状区域中。
带状矩阵高斯消元时间复杂度 O ( n D 2 ) O(nD^2) O(nD2), D D D为带宽。。但高斯消元时要向右找非零的数。
线 性 空 间 \Large{线性空间} 线性空间
\一转 线性空间
\二转 线性空间理解
线 性 基 \Large{线性基} 线性基
\三转 线性基
[ 例 3 ] WC 2011 最⻓路
拟 阵 \Large{拟阵} 拟阵
…
克 莱 姆 ( C r a m e r ) 法 则 \Large 克莱姆(\Large Cramer )法则 克莱姆(Cramer)法则
解线性方程用,略
伴 随 矩 阵 \Large{伴随矩阵} 伴随矩阵
矩阵A的伴随矩阵是A的余子矩阵的转置矩阵,即: a d j ( A ) = C T → [ a d j ( A ) ] i j = C j i adj(A)=C^T \to [adj(A)]_{ij}=C_{ji} adj(A)=CT→[adj(A)]ij=Cji
作为拉普拉斯公式的推论,关于 n × n n×n n×n的矩阵 A A A的行列式有:
A a d j ( A ) = a d j ( A ) A = d e t ( A ) I Aadj(A)=adj(A)A=det(A)I Aadj(A)=adj(A)A=det(A)I
…
判 断 二 分 图 是 否 存 在 完 备 匹 配 \Large 判断二分图是否存在完备匹配 判断二分图是否存在完备匹配
若存在,积和式,行列式均不为0。(邻接矩阵,相连的为x部标号,不相连的为0)
T u t t e M a t r i x \Large Tutte\ Matrix Tutte Matrix
…
自闭
dlsnb
[ 例 1 ] NOI2019 D2T1
O ( n l o g 2 ( n ) / n l o g ( n ) α ( n ) ) O(nlog^2(n)/nlog(n)\alpha(n)) O(nlog2(n)/nlog(n)α(n)) …
[ 例 2 ] n个点,m条边DAG,求删去每个点后1->n的最短路。
n,m 3e5
定义 f i f_i fi表示 1 → i 1\to i 1→i的最短距离, g i g_i gi表示 i → n i\to n i→n的最短距离。
拓扑序枚举,对于 x x x,拓扑序为 d ( x ) d(x) d(x),答案为
m i n d ( u ) < d ( x ) < d ( v ) f u + g v + w ( u , v ) \large min_{d(u)<d(x)<d(v)}f_u+g_v+w(u,v) mind(u)<d(x)<d(v)fu+gv+w(u,v)
[ 例 3 ] 给n个点m条边的有向图,计算每个点传递闭包大小,最多答案差两倍。(Ans/2 <= ans <= 2Ans)
n,m 2e5
例3 题解 :随机, O ( n ) O(n) O(n) 拓扑传最小值 f f f, f i = 1 n + 1 → n = 1 f i − 1 f_i=\frac{1}{n+1}\to n=\frac 1{f_i}-1 fi=n+11→n=fi1−1,多做几次精度就准了。
[ 例 4 ] SD省队集训D1T1
n点m条无向边,第i条边花费为2^i,要经过每一条边至少一次,且回到原地,求最小花费时间。
最小生成树,贪心调整…
题解
题解
建议看P4494 HAOI2018 反色游戏
[ 例 5 ] Hihocoder Challenge 28
n,k <= 50,e_w <= 1e9, 求所有生成树权值和的k次方和
把矩阵树定理中的数的空间拓宽到 k k k次多项式并且用求逆元的方法消元。
注意如果 k k k过大就直接代入 0.. n 0..n 0..n插值了。
copy的,不会
[ 例 6 ] 最小方差生成树 N 300 M 1e5 wi 1e18
暴力:枚举权值和(平均值)做MST,时间复杂度 O ( m l o g ( m ) ∑ w i ) O(mlog(m)\sum w_i) O(mlog(m)∑wi)
暴力2:本质不同的边排列顺序只有 m 2 m^2 m2种(只有经过两值中点才会交换顺序),直接枚举然后MST,时间复杂度 O ( m 3 l o g ( m ) ) O(m^3log(m)) O(m3log(m))。
发现当随着平均值 σ \sigma σ枚举增大, ( w i − σ ) 2 (w_i-\sigma)^2 (wi−σ)2是形状相同,顶点在x轴上,开口向上的二次函数,一条边如果被后面的其他边替换掉就再也不会回来。
按区间从小到大来求,在两条边大小关系改变时,考察能否用新的小边替换大边使得还是一棵树,也就是不断调整最小生成树,用 L C T LCT LCT维护,由于改变次数 O ( m 2 ) O(m^2) O(m2),所以时间复杂度 O ( m 2 l o g ( m ) ) O(m^2log(m)) O(m2log(m)),但 L C T LCT LCT常数很大。
暴力3:可以发现一条边出现在最小生成树中一定是一段区间,记作 [ l i , r i ] [l_i, r_i] [li,ri],可以用并查集维护最大生成树求出。求出 l , r l,r l,r后,得到 O ( m ) O(m) O(m)个时间点,从小到大扫,在 l i l_i li处加入边 i i i,在 r i r_i ri处删除 i i i。不用维护树的形态。时间复杂度 O ( m 2 l o g ( m ) ) ) O(m^2log(m))) O(m2log(m)))。
正解:维护树的形态,用 L C T LCT LCT维护最大生成树,加入一条边如果不连通, l i l_i li就是 − i n f -inf −inf,联通就在路径上查询边权最小的边j,让 l i = w i + w j 2 l_i=\frac{w_i+w_j}2 li=2wi+wj,弹出一条边的时候求出 r j r_j rj。求出来后用暴力3的方法求答案,时间复杂度 O ( m l o g ( m ) ) O(mlog(m)) O(mlog(m))
详见《ioi2018候选集训队论文<最小方差生成树>命题报告 何中天》
[ 例 7 ] [ 2-sat ] n个点,m条边,k个点的集合,每个点只属于一个集合。要在每个集合恰好选一个点,使得每一条边恰好有一个被选择。
问题就在如何保证一个集合只选一个,对于每个前缀后缀建辅助点,就可以建图了,类似于优化建图吧
[ 例 8 ] [ 2-sat ] n个点(x_i,y_i),每个点要可以建一个建筑,这个建筑是以该点为斜边的等腰直角三角形,斜边必须平行于x/y轴,所有建筑边长必须一样长。问最大边长。n <= 60
二分答案+拆点2sat 水
[ 例 9 ] [ 2-sat ] TCO Hard
大小为n的树给出,有m个物品,给每个物品确定一个位置p[i],使得k个形如“以p[x]为根,p[y]和p[z]的LCA是点Q”的限制被满足。
…
[ 例 10 ] CF 547D
n个点(x,y),对点黑白染色,使得每行每列都满足,|B-W|<=1,输出一种方案
n <= 2e5 x,y <= 2e5
先考虑<=0,对行列建点。有一个点就行列连边,是一个二分图,跑欧拉回路,从X部到Y部看作黑点,反之白点就行了。
考虑<=1,两边可能有奇点,没有欧拉回路,我们两边分别建一个虚点,向对方的奇点连边,奇点一定是偶数个(两边相等),所以直接跑欧拉回路。每个行/列最多连一条虚边,所以<=1。
也可以直接把奇点两两配对跑欧拉回路。
[ 例 11 ]n个点,m条边,可能有重边,对于这个图的边集的子集(2^m个),导出的子图的每个联通块内部都存在欧拉回路,我们就把答案加上这个子图的边数的平方,答案对1e9+7取模。n 1e5
先考虑答案+1,把m条边是否选看作变量,由于要deg为偶数,所有相当于异或为0,则有n个方程。
任意取这个图的生成树,这个秩是 如果有一个n-1阶的小矩阵的行列式不为0,则秩为n-1,整个的秩也就>=n-1。一棵生成树去除根后是n-1*n-1的,剩下的经过一些变换后可以恰好是matrix-tree的形式,行列式绝对值为1(树的生成树为1)不为0,所以证到了m这n个方程的秩为n-1 然后…自闭 又线代了 dlsnb wjznb S A M \Large SAM SAM [ 例 1 ] Bzoj 4556 [Tjoi2016&Heoi2016]字符串 给出字符串S,每次给出a,b,c,d,询问S[a,b]的所有子串和S[c,d]的最长公共前缀的最大值。 博客 [ 例 2 ] Bzoj十连测第五场 B 可持久化字符串 主席树维护next 倍增 [ 例 3 ] Bzoj 4310 SAM+二分+hash [ 例 4 ] Fim1 给定字符串S,维护一个字符串序列T,有3种操作 1.T.append(T[x]+c) 2.T.append(c+T[x]) 3.询问T[x]在S[l:r]中的出现次数 |S|,M <= 1e5 SAM+线段树合并 [ 例 5 ] 区间本质不同子串个数 区间本质不同回文串个数(貌似有在线根号算法) (离线) SAM 回文树(没学,自闭)来个博客 [ 例 6 ] CF700E 一个字符串对另一个字符串是好的当且仅当这个字符串在另一个字符串里出现了两次 给定字符串S1 求最大的k使得字符串序列S1,S2,…,Sk满足Si+1对Si都是好的。 对于i>1,Si+1一定是Si的一个后缀。所以只需二分长度,然后在SAM上,查询一个串在另一个串中出现次数是否大于2。至于怎么查,不知道。博客 [ 例 5 ] 给定字符串S,定义plcp(i,j)为最长回文公共前缀。 F ( x ) = ∑ 1 ≤ i ≤ x ∑ 1 ≤ j ≤ x p l c p ( i , j ) \large F(x)=\sum_{1\le i\le x}\sum_{1\le j\le x} plcp(i,j) F(x)=∑1≤i≤x∑1≤j≤xplcp(i,j) 每次在S后添加一个字母c,输出F(|S|) 考虑 F ( ∣ S ∣ ) − F ( ∣ S ∣ − 1 ) F(|S|)-F(|S|-1) F(∣S∣)−F(∣S∣−1),就是回文树上最后一个字母代表的节点与其他所有节点的LCA的长度和… 回文树。不会。 [ 例 6 ] 求一个字符串的所有字串中,任选2个(可以相同),计算 ∑ ( ∣ A ∣ + ∣ B ∣ − 2 L C A ( A , B ) ≤ L ) \sum(|A|+|B|-2LCA(A,B)\le L) ∑(∣A∣+∣B∣−2LCA(A,B)≤L) N <= 1e5, 串伪随机(其实不伪随机也可以做) 问题也就是询问该串的后缀树上,长度不超过L的… [ 例 7 ]Deep Purple 多次询问区间LBorder(L:Largest) 1e5 把求border转化为求period… 博客 [ 例 8 ] NOI赛前集训-D6T2 。。。 L y n d o n 串 \Large Lyndon串 Lyndon串 对于字符串 S S S,如果 S S S的最⼩后缀是他本身,那么 S S S是 L y n d o n Lyndon Lyndon串。 s s s为 L y n d o n Lyndon Lyndon串等价于 s s s本身是其循环移位中最小的⼀ 个 L y n d o n 分 解 \Large Lyndon分解 Lyndon分解 存在性 唯一性 D u v a l 算 法 \Large Duval算法 Duval算法 … [ 例 9 ] 2019NOI赛前集训 D6T3 … [ 例 10 ] Fim4 … ACM赛 做了4道水题,Freopen巨佬做了5道题 -> 排名6 (最高排名 2) 点 分 治 \Large 点分治 点分治 【例1】Luogu2056 [ZJOI2007]捉迷藏 树,点权0,1 每次修改一个点点权,询问两个最远1的距离 法1:括号序列 蒟蒻博客 法2:对于传统树分治做法,就是在每个树分治的分治中心上开个堆维护一下: • 每个子树一个堆维护到其的最大距离 • 再开个堆维护上面那个堆的前2大值 • 再开个堆维护全局的最大值 • 然后每次暴力更新即可,总复杂度O( (n + m)log^2n ) 【例2】Bzoj 2566 xmastree 和之前那个题差不多,对每个颜色分别维护即可 【例3】Bzoj 4372 烁烁的游戏 点分治 【例4】[Zjoi2015]幻想乡战略游戏‘ 点分 【例5】[Ynoi2012]D1T3 点分 【例6】floj307 不可知圆环 CF1010F 点分 生成函数 。。 【例7】[Ynoi2012]D2T3 一棵树,支持1.链上所有点加k,2.查询距离一个点<=1的所有点的点权的kth小 【例8】UOJ#191 Unknown 有一个元素为向量的序列S,下标从1开始,初始时S为空,选在你需要支持3种操作: 1.在S末尾添加一个元素(x,y) 2.删除S的末尾元素 3.询问下标在[l,r]区间内的元素中,(x,y)×Si的最大值 其中×表示叉积 5e5 做法:1.变成一颗树,树剖+线段树维护凸包 (log3),加上某种优化,就log2了 2.见题解 【例9】n个点的树,q次操作 1.修改点权 2.问当前最大权值联通块 L C T \Large LCT LCT 。。。 动 态 D P \Large 动态DP 动态DP 【例1】NOIP2018D2T3 【例2】有n个人,编号为0到n-1,每个人手上有一个ai 会进行n轮(从0开始)游戏,最开始有一个数x=0,第i轮轮到第i个人时,第i个人可以选择是否把x变成(x+ai)%n n轮之后编号为x的获胜。每个人只会采取如下策略:只有当变了x后必胜,不变x不必胜的情况下,他才会在他这轮变动x。 每次修改一个ai,问谁获胜。 可以发现只会有一个人会动,且只有遇到的数为(i-ai)%n时才会动。 前i个人肯定不会让x大于等于i。然后我们将i向(i-ai)%n < i 的连边。形成森林。 是一个开枪游戏 如果0活下来就是0 否则是开枪干掉0的编号最小的人 ? 【例3】[CodeChef Pushflow] n个点的图,每个点最多属于一个简单环,边有边权。 m次操作,询问两个点之间最大流或者修改一条边边权 一个 log 博客 LCT/树剖 【例4】[WineDAG’s prevention] n个点的树,q次操作,增加一个点权;翻转一条路径,询问路径和/MAX/MIN 两棵Splay,一棵维护形态,一棵维护权值 【例5】CFRound545 F Matches Are Not a Child’s Play LCT 区间赋值 【例6】有三部分点A,B,C,各有n,n1,n2个点。 其中A,B构成一棵树,A,C构成一棵树,A内部没有边。 随机i,j把B1Bi,C1Cj都删了,A仍然联通的概率 N 1e5 i递增的时候j递减,用LCT维护删除时间最小生成树 ////////////////////////////// 。。。。。。。。。。。 11111111111111111111 22222222222222222222 33333333333333333333 44444444444444444444 55555555555555555555 66666666666666666666 77777777777777777777 88888888888888888888 99999999999999999999 10101010101010101010 【例1】求出 A = {0,1,4,…,n^2,…}的生成函数 1 + x + x 2 + x 3 + . . . + x n + . . . = 1 1 − x 1+x+x^2+x^3+...+x^n+... = \frac 1{1-x} 1+x+x2+x3+...+xn+...=1−x1 1 + x + 2 x 2 + 3 x 3 + . . . + n x n + . . . = 1 ( 1 − x ) 2 1+x+2x^2+3x^3+...+nx^n+...=\frac 1{(1-x)^2} 1+x+2x2+3x3+...+nxn+...=(1−x)21 1 + x 2 + x 4 + . . . + x 2 n + . . . = 1 1 − x 2 1+x^2+x^4+...+x^{2n}+...=\frac 1{1-x^2} 1+x2+x4+...+x2n+...=1−x21 【例2】4种球,每种无限个,要选出n个球。n很大,要满足: 红球只能选偶数个 黄球只能选5的倍数个 蓝球最多只能选4个 绿球只能选1或0个 R ( x ) = 1 + x 2 + x 4 + . . . R(x)=1+x^2+x^4+... R(x)=1+x2+x4+... Y ( x ) = 1 + x 5 + x 10 + . . . Y(x)=1+x^5+x^{10}+... Y(x)=1+x5+x10+... B ( x ) = 1 + x + x 2 + x 3 + x 4 B(x)=1+x+x^2+x^3+x^4 B(x)=1+x+x2+x3+x4 G ( x ) = 1 + x G(x)=1+x G(x)=1+x 指 数 型 \Large 指数型 指数型 1 + x + x 2 2 ! + x 3 3 ! + . . . = e x 1+x+\frac{x^2}{2!}+ \frac{x^3}{3!}+...=e^x 1+x+2!x2+3!x3+...=ex 1 + x 2 2 ! + x 4 4 ! + . . . = e x + e − x 2 1+\frac{x^2}{2!}+\frac{x^4}{4!}+...=\frac{e^x+e^{-x}}2 1+2!x2+4!x4+...=2ex+e−x x + x 3 3 ! + x 5 5 ! + . . . = e x − e − x 2 x+\frac{x^3}{3!}+\frac{x^5}{5!}+...=\frac{e^x-e^{-x}}{2} x+3!x3+5!x5+...=2ex−e−x 一 维 循 环 卷 积 \Large 一维循环卷积 一维循环卷积 F F T FFT FFT 二 维 循 环 卷 积 \Large 二维循环卷积 二维循环卷积 对每一维进行 D F T DFT DFT F W T \Large FWT FWT 就是k维循环卷积 【例3】n点m边有向图,边权是二元组(ai,bi),你身上有一个二元组(a,b),每经过一条边,二元组会变成((a+ai)%n,(b+bi)%n-1)。另外给定一个k,对于每个点i,以及二元组(x,y),你要求从i点出发,经过恰好k条边回到i,且二元组变成了(x,y)的方案数。答案对1163962801取模。 n<=22,m<=10000,k<=1e9 把一个n×(n-1)的矩阵设置为类型Mat,Mat的乘法运算定义为二维循环卷积,那么这个图的转移矩阵事实上就是一个n×n的以Mat为值的矩阵,并且可以发现,由于Mat的运算满足交换律,分配律还有结合律,所以转移矩阵的乘法同样可以当成正常矩阵乘法来做。现在我们要做的就是加快这个矩阵乘法的效率。 …没抄完 1163962801 - 1 = 1163962800 = 2^4 * 3^2 * 5^2 * 7 * 11 * 13 * 17 * 19 所以1~10都是它的原根。。。? 【例4】一个TC Hard 一个n次多项式P(x),且满足[x_i]P(x)=[x_n-i]P(x) [x^i]表示第i项的系数 现在告诉你P(x)^2在mod x^n 意义下循环卷积的值 求P(x) n <= 40 【例5】给你一个M个点的图,图中任意一条从S到T的长度为K的倍数的路径会对答案造成 ( n L e n ) \binom{n}{Len} (Lenn)的贡献,Len为路径长度。路径可以经过重复的边,答案对P取模。 M <= 10 K <= 1000 P $\equiv$1(mod K),N <= 1e18 组合数贡献可以通过加自环去掉,也就是Len时间再走,其他时间走自环/休息,那么每天路径的贡献都是1。这样的话自环不能算作路经长度。 【例6】染色问题 m种颜色 染n个点的环,要求第i种颜色恰好染ci次,求本质不同的方案数。 …生成函数 burnside引理/Polya定理 牛 顿 迭 代 \Large 牛顿迭代 牛顿迭代 泰 勒 展 开 \Large 泰勒展开 泰勒展开 多 项 式 求 逆 \Large 多项式求逆 多项式求逆 多 项 式 除 法 \Large 多项式除法 多项式除法 多 项 式 L n \Large 多项式Ln 多项式Ln 多 项 式 e x p \Large 多项式exp 多项式exp 多项式多点求值 多项式多点插值 【例7】拆分数的nlog做法:生成函数->多项式expDay_3 字符串
Day_4 ACM
Day_5 树上数据结构
Day_5 生成函数及多项式