一些技巧 && 常数优化 && 出现の错误 [绝赞更新中!]

开坑缘由

7.21算法

今天DTZ大爷教了我一个算欧拉函数的好方法......是质因数复杂度的数组

这让我想到,这些小技巧小idea,不少时候,可能就是考场上最致命、最一击必杀的“大招”数据结构

所以开个坑记录一下,定有好处ide

7.21

欧拉函数的意义是比一个数小的数中有多少个和它互质的,不要考场上想到了这句话想不到欧拉函数函数

而后是求欧拉函数的一个方法优化

设一个数$x=\prod_{i=1}^{k}p_i^{a_i}$,那么:idea

$\varphi(x)=\prod_{i=1}^{k}(p_i-1)p_i^{a_i-1}=x\prod_{i=1}^{k}\frac{p_i-1}{p_i}$

7.24

在作FFT,NTT之类的题目时,会用到大量的模数指针

这时,如下三种方法:code

#define MOD 1000000007
const ll MOD=1000000007
ll MOD=1000000007

第一种快于第二种快于第三种排序

并且都是快不少的那种快法

所以最好使用第一种

7.25

NTT中,作多项式求逆和多项式开根的时候,每次迭代只须要取前len项出来,而后len到(len<<1)的项必定要清零

这样会快不少

同时注意原式中能约的就约掉,也能提高常数

7.29

$\varphi(i\ast j)=\frac{\varphi(i)\varphi(j)d}{\varphi(d)}$

其中$d=gcd(i,j)$

莫比乌斯函数的性质利用

$\mu\ast I = \epsilon$

$[gcd(i,j)==1]=\sum_{e|i,e|j}\mu(e)$

这玩意有啥用呢?好比说我要求$\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)$

那么能够这么化式子

原式

$=\sum_{d=1}^n \frac{d}{\varphi(d)} \sum_{i=1}^n \sum_{j=1}^m \varphi(i)\varphi(j) [gcd(i,j)==d]$

$=\sum_{d=1}^n \frac{d}{\varphi(d)} \sum_{i=1}^{\frac{n}{d}} \sum_{j=1}^{\frac{m}{d}} \varphi(id)\varphi(jd) [gcd(i,j)==1]$

$=\sum_{d=1}^n \frac{d}{\varphi(d)} \sum_{i=1}^{\frac{n}{d}} \sum_{j=1}^{\frac{m}{d}} \varphi(id)\varphi(jd) \sum_{e|i,e|j}\mu(e)$

$=\sum_{e=1}^n\mu(e)\sum_{d=1}^\frac ne\frac d{\varphi(d)}\sum_{i=1}^\frac n{de}\sum_{j=1}^\frac m{de}\varphi(ide)\varphi(jde)$

设$T=de$

那么原式

$=\sum_{T=1}^n \sum_{d|T} \mu(\frac{T}{d})\frac{d}{\varphi(d)} \sum_{i=1}^{\frac{n}{T}} \varphi(iT) \sum_{j=1}^{\frac{m}{T}} \varphi(jT)$

这样题目就变简单了

7.30

今天又作到关于树、堆之类的东西的形态构建题目了

对于问你一棵二叉树/多叉树有几种构建方式的,能够考虑从每一个节点的子树的角度去DP、设方程,而后用多项式优化,或者组合数之类的

8.2

设$F_i$表示斐波那契数列的第$i$项,那么:

$gcd(F_i,F_j)=F_{gcd(i,j)}$

同时注意线性筛中间要break的是$i$ $mod$ $ pri[j] ==0$,不要漏掉了$==0$!!!

积性函数的断定:

两个积性函数的狄利克雷卷积仍然是积性函数

8.4

二项式反演:

$F(n)=\sum_{i=0}^n C_n^i G(i)$

$G(n)=\sum_{i=0}^n (-1)^{n-i} C_n^i F(i)$

8.12

$LCT$的$splay$以前写的$push$中有的时候没法使用递归写法,此时要注意弹栈过程当中的$top--$

while(sta[top--]) pushdown(sta[top]);
while(sta[top]) pushdown(sta[top--]);

下面的是对的,上面是错的

8.13

$SAM$的经常使用操做是把$fail$指针(也就是$fa$)反过来,而后在树上$dp$(这个好像很sb的样子我为何要写上来qwq)(我太菜了)

由$Polya$定理能够计算把一个长度为$n$的环涂上$m$种颜色的不一样方案:

$L=\frac{1}{n}\sum_{i=1}^{n} m^{gcd(i,n)}$

9.10

很久没更新了......

长链剖分+单调队列合并,能够把求树上长度为$[L,R]$区间的路径的相关问题作到$O(n)$

遇到长得像二次方程根的那种递推、通项之类的东西,能够考虑反推特征根方程

两棵树经过一条边连在一块儿的时候,新树的直径端点是原来两棵树的四个端点中的两个

遇到和深度相关的、有继承关系的问题,能够考虑同一条链共用dp值的方式

SA遇处处理原序列顺序的相关问题时,能够考虑加入主席树,按照sa顺序加入,元素是原位置

10.25

一个多月没更新......

树形dp在n小的时候,能够考虑以每一个点为根进行dp,这样能够加入一些限制,可能有奇效

树状数组能够维护区间加、区间查询和!(详见HNOI2017影魔)

树的拓扑序个数为$\frac{n}{\prod size(u)}$

1.5

诈尸式更新

考虑一个函数是否为多项式时,能够差分它

若是通过了$k$次差分后获得0,那么它是一个$k-1$次多项式

这个能够和拉格朗日插值一块儿用

4.12

泰勒展开.....

看到和式有着$\sum_i delta\ast\frac{x^i}{i!}$的形式的时候,要考虑到$e^x$的泰勒展开式:

$e^x=\sum_{i=0}^{\infty} \frac{x^i}{i!}$

4.14

更新一个很是规思路list

纯序列问题:cdq分治,总体二分,树套树,奇怪的线段树

序列问题且只和区间边界有关:先考虑dp,不行多是线段树(usaco式合并)

须要维护区间对一个值取max/min:吉老师线段树(Segment Tree Beats!)

计算几何奇怪形状:分步枚举,考虑哪些元素的肯定会对其余人限制最大

关于模意义下二次方程:二次剩余

序列上的点是连续的状况(也就是原本要用微积分的):注意此时序列上任选两个点重合几率为0

待续(可能后面会考虑把这个东西改为一个trick列表.....?)

5.3

期中考试去了......有一段时间没作题

还好考了个年25,还看得过去吧(虽然本身不是特别满意)

= =

遇到排序相关、交换相关的题目,能够考虑按照元素大小变成零一序列,可能有奇效

5.4

四色定理相似问题能够先生成树,再看剩下的边是否是二分图,最后两个分别染色而后合并

除此以外就只能爆搜了

注意这种条件下不知足四色定理的图必定有奇环:二分图断定原理

考虑dp的时候,要注意一些全局的限制:可能会遇到dp的两个维度有乘起来不超过一个值的状况

此时可能能够导出调和级数复杂度!

走路+选择路上元素问题的dp,能够反过来考虑,不是dp已经选了那些,而是dp剩下的都没选的时候(也就是走到哪里为止)能够配合上述调和级数作

这种dp要注意的是,关于走路中的一些“体力限制”,会出现你没走到哪里可能会花更少的“全局体力”,此时注意在dp中考虑这一因素的影响

调和级数dp在滚动数组的时候采用一个一个重置为in的方式比较可靠,否则极可能memset复杂度挂

5.7

若是想对于一个n点图的凸包求出去掉凸包上每个点后,在新的n-1点图中获得的新凸包的点集的并集,能够采用这样的方法:

设原凸包点集依次为$a[1...m]$,那么对于奇数下标的标上颜色一,偶数颜色二,若是$m$是奇数那最后一个标颜色3、第一个去掉颜色

而后作三次求凸包,每次去掉一种颜色的点(没有颜色的就无论),三个凸包上全部的点集合就是所求的并集

这个方法简而言之就是每隔一个点去掉一个,能够把这一算法复杂度从$O(n^2\log n)$降到$O(n\log n)$

排列问题双巨头:括号序列!线段树!

5.8

线段树里面不只能够套凸包优化决策,竟然还能够套半平面交......

遇到区间交集题目或者什么别的东西,有“选择的长度和贡献线性相关”的,能够考虑一下从一次函数的观点看问题,可能能变成几何题

遇到不会dp,若是n^3或者kn^2能接受的话,想想区间dp的方法,并尝试一波四边形优化

四边形优化不必定要证实,能够打个表试一试(固然前提是要先确保原来的区间dp是对的,要先对拍再打表)

5.9

线段树求最小值和最小值个数能够解决区间覆盖型问题

5.12

多模式串匹配算法要想到AC自动机!能够在上面跑dp

注意AC自动机要合并fail树上全部祖先节点的信息

平均数求和问题若是有二分性则能够01分数规划!

平均的那个除N挪到右边,再挪回来,能够去掉siz在dp中的限制

5.13

cf559div1打的奇差无比......找规律还能fst,策略大失败,怀疑本身的智商没资格搞OI了

遇到

有一个排列,给出这个排列每一个位置的一个和后面位置以及大小有关的信息(好比在它后面第一个比他大的),求这个排列

的这种题,能够考虑排列的合法性。不少时候会发现会出现例如$i<j<p[i]$则$a[i]>a[j]$必须知足的状况(这个基于区间大小限制)

这样就能够创建限制拓扑图,能够拓扑排序赋值

5.16

对于一些有不少位置,每一个位置有不少取值,而后问你全部这些取值的前$k$大的问题,可使用优先队列完成:

用pair记录取值和取值位置,而后每次取出优先队列里面取值最大的那个,而后在对应的位置查询第二大(第三大、第四大……)的取值,再插入

适用于能够查询区间$k$大的数据结构,例如主席树、可持久化trie等

sam有一些新get的技巧,去看我写的sam那篇博客吧

相关文章
相关标签/搜索