7.21算法
今天DTZ大爷教了我一个算欧拉函数的好方法......是质因数复杂度的数组
这让我想到,这些小技巧小idea,不少时候,可能就是考场上最致命、最一击必杀的“大招”数据结构
所以开个坑记录一下,定有好处ide
欧拉函数的意义是比一个数小的数中有多少个和它互质的,不要考场上想到了这句话想不到欧拉函数函数
而后是求欧拉函数的一个方法优化
设一个数$x=\prod_{i=1}^{k}p_i^{a_i}$,那么:idea
在作FFT,NTT之类的题目时,会用到大量的模数指针
这时,如下三种方法:code
#define MOD 1000000007 const ll MOD=1000000007 ll MOD=1000000007
第一种快于第二种快于第三种排序
并且都是快不少的那种快法
所以最好使用第一种
NTT中,作多项式求逆和多项式开根的时候,每次迭代只须要取前len项出来,而后len到(len<<1)的项必定要清零
这样会快不少
同时注意原式中能约的就约掉,也能提高常数
其中$d=gcd(i,j)$
莫比乌斯函数的性质利用
这玩意有啥用呢?好比说我要求$\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)$
那么能够这么化式子
原式
设$T=de$
那么原式
这样题目就变简单了
今天又作到关于树、堆之类的东西的形态构建题目了
对于问你一棵二叉树/多叉树有几种构建方式的,能够考虑从每一个节点的子树的角度去DP、设方程,而后用多项式优化,或者组合数之类的
设$F_i$表示斐波那契数列的第$i$项,那么:
$gcd(F_i,F_j)=F_{gcd(i,j)}$
同时注意线性筛中间要break的是$i$ $mod$ $ pri[j] ==0$,不要漏掉了$==0$!!!
积性函数的断定:
两个积性函数的狄利克雷卷积仍然是积性函数
二项式反演:
$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)$
$LCT$的$splay$以前写的$push$中有的时候没法使用递归写法,此时要注意弹栈过程当中的$top--$
while(sta[top--]) pushdown(sta[top]); while(sta[top]) pushdown(sta[top--]);
下面的是对的,上面是错的
$SAM$的经常使用操做是把$fail$指针(也就是$fa$)反过来,而后在树上$dp$(这个好像很sb的样子我为何要写上来qwq)(我太菜了)
由$Polya$定理能够计算把一个长度为$n$的环涂上$m$种颜色的不一样方案:
$L=\frac{1}{n}\sum_{i=1}^{n} m^{gcd(i,n)}$
很久没更新了......
长链剖分+单调队列合并,能够把求树上长度为$[L,R]$区间的路径的相关问题作到$O(n)$
遇到长得像二次方程根的那种递推、通项之类的东西,能够考虑反推特征根方程
两棵树经过一条边连在一块儿的时候,新树的直径端点是原来两棵树的四个端点中的两个
遇到和深度相关的、有继承关系的问题,能够考虑同一条链共用dp值的方式
SA遇处处理原序列顺序的相关问题时,能够考虑加入主席树,按照sa顺序加入,元素是原位置
一个多月没更新......
树形dp在n小的时候,能够考虑以每一个点为根进行dp,这样能够加入一些限制,可能有奇效
树状数组能够维护区间加、区间查询和!(详见HNOI2017影魔)
树的拓扑序个数为$\frac{n}{\prod size(u)}$
诈尸式更新
考虑一个函数是否为多项式时,能够差分它
若是通过了$k$次差分后获得0,那么它是一个$k-1$次多项式
这个能够和拉格朗日插值一块儿用
泰勒展开.....
看到和式有着$\sum_i delta\ast\frac{x^i}{i!}$的形式的时候,要考虑到$e^x$的泰勒展开式:
$e^x=\sum_{i=0}^{\infty} \frac{x^i}{i!}$
更新一个很是规思路list
纯序列问题:cdq分治,总体二分,树套树,奇怪的线段树
序列问题且只和区间边界有关:先考虑dp,不行多是线段树(usaco式合并)
须要维护区间对一个值取max/min:吉老师线段树(Segment Tree Beats!)
计算几何奇怪形状:分步枚举,考虑哪些元素的肯定会对其余人限制最大
关于模意义下二次方程:二次剩余
序列上的点是连续的状况(也就是原本要用微积分的):注意此时序列上任选两个点重合几率为0
待续(可能后面会考虑把这个东西改为一个trick列表.....?)
期中考试去了......有一段时间没作题
还好考了个年25,还看得过去吧(虽然本身不是特别满意)
= =
遇到排序相关、交换相关的题目,能够考虑按照元素大小变成零一序列,可能有奇效
四色定理相似问题能够先生成树,再看剩下的边是否是二分图,最后两个分别染色而后合并
除此以外就只能爆搜了
注意这种条件下不知足四色定理的图必定有奇环:二分图断定原理
考虑dp的时候,要注意一些全局的限制:可能会遇到dp的两个维度有乘起来不超过一个值的状况
此时可能能够导出调和级数复杂度!
走路+选择路上元素问题的dp,能够反过来考虑,不是dp已经选了那些,而是dp剩下的都没选的时候(也就是走到哪里为止)能够配合上述调和级数作
这种dp要注意的是,关于走路中的一些“体力限制”,会出现你没走到哪里可能会花更少的“全局体力”,此时注意在dp中考虑这一因素的影响
调和级数dp在滚动数组的时候采用一个一个重置为in的方式比较可靠,否则极可能memset复杂度挂
若是想对于一个n点图的凸包求出去掉凸包上每个点后,在新的n-1点图中获得的新凸包的点集的并集,能够采用这样的方法:
设原凸包点集依次为$a[1...m]$,那么对于奇数下标的标上颜色一,偶数颜色二,若是$m$是奇数那最后一个标颜色3、第一个去掉颜色
而后作三次求凸包,每次去掉一种颜色的点(没有颜色的就无论),三个凸包上全部的点集合就是所求的并集
这个方法简而言之就是每隔一个点去掉一个,能够把这一算法复杂度从$O(n^2\log n)$降到$O(n\log n)$
排列问题双巨头:括号序列!线段树!
线段树里面不只能够套凸包优化决策,竟然还能够套半平面交......
遇到区间交集题目或者什么别的东西,有“选择的长度和贡献线性相关”的,能够考虑一下从一次函数的观点看问题,可能能变成几何题
遇到不会dp,若是n^3或者kn^2能接受的话,想想区间dp的方法,并尝试一波四边形优化
四边形优化不必定要证实,能够打个表试一试(固然前提是要先确保原来的区间dp是对的,要先对拍再打表)
线段树求最小值和最小值个数能够解决区间覆盖型问题
多模式串匹配算法要想到AC自动机!能够在上面跑dp
注意AC自动机要合并fail树上全部祖先节点的信息
平均数求和问题若是有二分性则能够01分数规划!
平均的那个除N挪到右边,再挪回来,能够去掉siz在dp中的限制
cf559div1打的奇差无比......找规律还能fst,策略大失败,怀疑本身的智商没资格搞OI了
遇到
有一个排列,给出这个排列每一个位置的一个和后面位置以及大小有关的信息(好比在它后面第一个比他大的),求这个排列
的这种题,能够考虑排列的合法性。不少时候会发现会出现例如$i<j<p[i]$则$a[i]>a[j]$必须知足的状况(这个基于区间大小限制)
这样就能够创建限制拓扑图,能够拓扑排序赋值
对于一些有不少位置,每一个位置有不少取值,而后问你全部这些取值的前$k$大的问题,可使用优先队列完成:
用pair记录取值和取值位置,而后每次取出优先队列里面取值最大的那个,而后在对应的位置查询第二大(第三大、第四大……)的取值,再插入
适用于能够查询区间$k$大的数据结构,例如主席树、可持久化trie等
sam有一些新get的技巧,去看我写的sam那篇博客吧