上一篇有点多就开新的了
文章目录
- 树哈希
- wqswqswqs二分
- 单位根反演
- 威佐夫博弈
- 范德蒙德行列式
- BEST定理
- 平面图欧拉定理
- FWT转移矩阵的推导
- 保序回归
- 二分图最大团
- 一些数学小结论
- 范德蒙德卷积
- 乘转加卷积
- 斐波那契前缀和
- 杜教筛+μ\muμ
- 单幂转下降幂
- 下降幂X组合数
- 多项式gcd
- 无逆元求行列式
- ?
- 其他小技巧
树哈希
额方法很多随便找个都可以用,是有根树的,无根树的哈希要换根加个数据结构。
fx=∑y∈sonxfy×P(sizy)f_x=\sum_{y\in son_x}f_y\times P(siz_y)fx=y∈sonx∑fy×P(sizy)
P(x)P(x)P(x)是一个不重的函数就行来,可以用pxp^{x}px,第xxx个质数或者ωnx\omega_{n}^xωnx都可以。
或者
fx=sizx×∑y∈sonxfyP(i)f_x=siz_x\times\sum_{y\in son_x}f_yP(i)fx=sizx×y∈sonx∑fyP(i)
不过这个的fyf_yfy需要按照大小排序(不然就是有序的儿子了)
wqswqswqs二分
一种二分斜率的方法。
对于一个有限制的凸函数问题(求最大值但是斜率不断减小,或者求最小值但是斜率不断增大),我们不知道这个凸函数但是我们可以设一条直线y=kx+by=kx+by=kx+b与这个函数相切。
然后当y=kx+by=kx+by=kx+b且到我们要求的点的时候就是答案了。
主要的难点在于确定凸函数的定义和二分kkk的时候如何求出bbb的最值。
需要特别注意的一点就是wqswqswqs最后二分出来的结果求得的并不一定是合法的方案,可能是与合法方案答案相同的(也就是这个凸函数恰好切到一段斜率与二分相等的位置)。
常见的凸函数问题:
- 背包限制问题
- 最小生成树限制问题
- 费用流模型问题
单位根反演
补一下上个手记剩下的
[k∣n]=1n∑i=0n−1ωni×k[k|n]=\frac{1}{n}\sum_{i=0}^{n-1}\omega_{n}^{i\times k}[k∣n]=n1i=0∑n−1ωni×k
一般和二项式定理套
威佐夫博弈
两堆石头可以选择取走一堆或两堆的相同个数,求是否先手必胜。
证明:设石头个数a<ba<ba<b那么若⌊(b−a)×1+52⌋=a\lfloor (b-a)\times \frac{1+\sqrt 5}{2}\rfloor=a⌊(b−a)×21+5⌋=a则后手必胜,否则先手必胜。
范德蒙德行列式
对于矩阵FFF
∣x10x20...xm−10xm0x11x21...xm−11xm1...............x1n−1x2n−2...xm−1n−1xmn−1x1nx2n...xm−1nxmn∣\begin{vmatrix} x_1^0 & x_2^0 & ... & x_{m-1}^0 & x_{m}^0\\ x_1^1 & x_2^1 & ... & x_{m-1}^1 & x_m^1\\ ... & ... & ... & ... & ...\\ x_1^{n-1} & x_2^{n-2} & ... & x_{m-1}^{n-1} & x_{m}^{n-1}\\ x_1^{n} & x_2^{n} & ... & x_{m-1}^{n} & x_{m}^{n} \end{vmatrix}∣∣x10x11...x1n−1x1nx20x21...x2n−2x2n...............xm−10xm−11...xm−1n−1xm−1nxm0xm1...xmn−1xmn∣∣
也就是Fi,j=xijF_{i,j}=x_i^jFi,j=xij时,
detF=∏i<j(xj−xi)\det F=\prod_{i<j}(x_j-x_i)detF=i<j∏(xj−xi)
BEST定理
记欧拉图GGG,记这张图不同的欧拉回路数量为ec(G)ec(G)ec(G)那么有
ec(G)=troot(G,k)∏v∈V(deg(v)−1)!ec(G)=t^{root}(G,k)\prod_{v\in V}(deg(v)-1)!ec(G)=troot(G,k)v∈V∏(deg(v)−1)!
其中troot(G,k)t^{root}(G,k)troot(G,k)表示图GGG以kkk为根的外向树数量
平面图欧拉定理
记连通无向平面图GGG点集VVV和边集EEE还有区域个数FFF那么有
V+F=E+2V+F=E+2V+F=E+2
FWT转移矩阵的推导
先定义最初始的矩阵c(i,j)c(i,j)c(i,j)表示FWT(x)[i]=∑j=0nc(i,j)xjFWT(x)[i]=\sum_{j=0}^nc(i,j)x_jFWT(x)[i]=∑j=0nc(i,j)xj
然后
FWT(A)[k]FWT(B)[k]=FWT(C)[k]FWT(A)[k]FWT(B)[k]=FWT(C)[k]FWT(A)[k]FWT(B)[k]=FWT(C)[k]
∑i=0n∑j=0nAiBjc(k,i)c(k,j)=∑i=0nCic(k,i)\sum_{i=0}^n\sum_{j=0}^nA_iB_jc(k,i)c(k,j)=\sum_{i=0}^nC_ic(k,i)i=0∑nj=0∑nAiBjc(k,i)c(k,j)=i=0∑nCic(k,i)
又有
Ck=∑ioptj=kAiBjC_k=\sum_{i\ opt\ j=k}A_iB_jCk=i opt j=k∑AiBj
∑i=0n∑j=0nAiBjc(k,i)c(k,j)=∑i=0n∑j=0nc(k,ioptj)AiBj\sum_{i=0}^n\sum_{j=0}^nA_iB_jc(k,i)c(k,j)=\sum_{i=0}^n\sum_{j=0}^nc(k,i\ opt\ j)A_iB_ji=0∑nj=0∑nAiBjc(k,i)c(k,j)=i=0∑nj=0∑nc(k,i opt j)AiBj
就有
c(k,i)c(k,j)=c(k,ioptj)c(k,i)c(k,j)=c(k,i\ opt\ j)c(k,i)c(k,j)=c(k,i opt j)
然后对于每个i,ji,ji,j分位考虑然后根据optoptopt的性质推出FWTFWTFWT的矩阵再求逆推出IFWTIFWTIFWT的矩阵就好了。
保序回归
对于序列aaa,有一些形如ai≤aja_i\leq a_jai≤aj的限制,把xxx变为yyy的代价为∣x−y∣k|x-y|^k∣x−y∣k,要求使得代价和最小。
常用的方法:
- 整体二分:考虑对于一个midmidmid,把每个数设置为mid+k(k∈{0,1})mid+k(k\in\{0,1\})mid+k(k∈{0,1}),然后求解出最小答案之后继续分0/10/10/1下去二分。求解的方法一般为:最大权闭合子图(一般情况),dp等。
- 正常二分+单调性解决。
- 在kkk不是很大的情况下可以考虑斜率优化。
- 神必方法。
玄题待补:
#6518. 「雅礼集训 2018 Day11」序列
P5294 [HNOI2019]序列
二分图最大团
二分图最大团(即选出的集合中左边的每个点向右边的每个点都有连边)为:总点数减去最大独立集。
一些数学小结论
范德蒙德卷积
∑i=0k(ni)(mk−i)=(n+mk)\sum_{i=0}^k\binom{n}{i}\binom{m}{k-i}=\binom{n+m}{k}i=0∑k(in)(k−im)=(kn+m)
乘转加卷积
是乘转加但是不完全是
n×m=(n+m2)−(n2)−(m2)n\times m=\binom{n+m}{2}-\binom{n}{2}-\binom{m}{2}n×m=(2n+m)−(2n)−(2m)
斐波那契前缀和
∑i=1nfi=fi+2−1\sum_{i=1}^nf_i=f_{i+2}-1i=1∑nfi=fi+2−1
杜教筛+μ\muμ
怎么说是一个挺神奇的技巧吧就是因为μ∗I=ϵ\mu*I=\epsilonμ∗I=ϵ所以假设我们要求f∗μf*\muf∗μ的前缀和,然后f∗μ∗I=f∗ϵf*\mu*I=f*\epsilonf∗μ∗I=f∗ϵ所以我们如果能快速的求fff的前缀和就可以快速的用杜教筛求f∗μf*\muf∗μ的前缀和。
具体的例子比如说斐波那契数列Fbi∗μFbi*\muFbi∗μ,和矩阵乘法配合能有奇效的样子
单幂转下降幂
设
f(x)=∑i=0naixi=∑i=0nbixi‾f(x)=\sum_{i=0}^na_ix^i=\sum_{i=0}^nb_ix^{\underline i}f(x)=i=0∑naixi=i=0∑nbixi
根据
xn=∑i=0n{ni}xi‾x^n=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}x^{\underline i}xn=i=0∑n{ni}xi
得到
bi=∑j=in{ji}ajb_i=\sum_{j=i}^n\begin{Bmatrix}j\\i\end{Bmatrix}a_jbi=j=i∑n{ji}aj
时间复杂度O(n2)O(n^2)O(n2)
下降幂X组合数
下降幂转组合数第二项
(nk)×km‾=(n−mk−m)×nm‾\binom{n}{k}\times k^{\underline{m}}=\binom{n-m}{k-m}\times n^{\underline{m}}(kn)×km=(k−mn−m)×nm
多项式gcd
记多项式F(x)F(x)F(x)各项系数的gcdgcdgcd为d(F(x))d(F(x))d(F(x)),那么有
d(F(x)×G(x))=d(F(x))×d(G(x))d(F(x)\times G(x))=d(F(x))\times d(G(x))d(F(x)×G(x))=d(F(x))×d(G(x))
无逆元求行列式
使用辗转相除法,第iii行的理论操作次数应该是O(n+loga)O(n+\log a)O(n+loga)因为ai,ia_{i,i}ai,i每次期望除二。
ll Det(){ll ans=1;for(ll i=1;i<=n;i++){if(!a[i][i]){for(ll j=i+1;j<=n;j++)if(a[j][i]){swap(a[i],a[j]);ans=P-ans;break;}}for(ll j=i+1;j<=n;j++){while(a[j][i]){if(a[j][i]<a[i][i]){swap(a[i],a[j]);ans=P-ans;if(!a[j][i])break;}ll rate=P-a[j][i]/a[i][i];for(ll k=i;k<=n;k++)(a[j][k]+=rate*a[i][k]%P)%=P;}}}for(ll i=1;i<=n;i++)ans=ans*a[i][i]%P;return (ans+P)%P;
}
?
从(1,1)(1,1)(1,1)出发不经过对角线走到(n,m)(n>m)(n,m)(n>m)(n,m)(n>m)的方案数是
(n+mm)−(n+mm−1)\binom{n+m}{m}-\binom{n+m}{m-1}(mn+m)−(m−1n+m)
其他小技巧
- a+b=min(a,b)+max(a,b)=a∣b+a&ba+b=\min(a,b)+\max(a,b)=a|b+a\&ba+b=min(a,b)+max(a,b)=a∣b+a&b
- bitset的count是O(nω)O(\frac{n}{\omega})O(ωn)的!!!