- 因为cmath库中的log2函数效率不高,通常可以使用O(n)递推预处理出1-n这n种区间长度各自对应的k值(区间[x,y],k=log2(y-x+1)),具体的,设log[d]表示log2(d)向下取整,则有log[d]=log[d/2]+1
- 强连通图的特征即为任意一点i,都有i的入度和出度均不为0;DAG上通过加边使得该树变为强连通图的最少边数即为入度为0的点数in和出度为0的点数out的最大值;即为max(in,out);补充:通常应用为tarjan强连通缩点后的DAG
- 当叶子节点数=1时,将一个有桥图通过加边变为边双连通图至少要添加的边数为0;否则为(叶子数+1)/2
- 利用字符串哈希判断循环节,len为整字串的长度n的约数
当字符串为整循环节时 只需要判断l~r-len等于l+len~r 当字符串需要补充字符成为周期时 只需要删除(r-l+1)%len的剩余字符,如上 bool judge(int l,int r,int len) { return h[r-len]-h[l-1]*power[r-l+1-len]==h[r]-h[l+len-1]*power[r-l+1-len]; }
- 异或的技巧
自反性 A^B^B=A^0=A (异或同时满足交换律和结合律)
-
错排问题:要求将编号1~n的n个元素放回n个位置,元素i不能在i位置上的方案数;
递推式为D(i)=(i-1)*[D(i-1)+D(i-2)]
解释为:共有i个元素,当前放第x个元素不能放在x位置上,可分为两种情况:一种是x可选择i-1个位置其中一个与其互换位置,即被x占用的位置原先的数y在x的原位置,剩下i-2个元素错排方案为D[i-2]种,则方案为(i-1)*D[i-2];而另一种为x选择i-1个位置其中一个放置,被x占了的位置不占用x原来的位置,故会剩下i-1个元素,i-1个元素进行错排,方案为(i-1)*D[i-1]种,故上式成立。
void D_init(int n) { d[1]=0; d[2]=1; for(int i=3;i<=n;i++) d[i]=(ll)((i-1)*(d[i-1]+d[i-2])%mod)%mod; return; }
- 区间最大公约数性质:
,因此查询区间的gcd即可有表达式:
,其中
表示树状数组维护下的从
NOIP常用技巧
于 2021-07-02 09:22:38 首次发布