CF/其它 计数乱做

CF1515E Phoenix and Computers (2200)

最后一定是若干段全都手动打开的电脑,每一段中间有一台自动开启的电脑。

将 一台自动开启-一段手动开启 视作一整段,则长度为 l 的一段方案数是 2n2(先随意开启一台电脑,之后只能选择向左或向右拓展)。

写成生成函数后二项式展开即可,时间复杂度 O(n2)(式子不见了)

CF1621G Weighted Increasing Subsequences (3200)

考虑对每一个元素 ai 计算贡献。

x 为最后一个大于 aia 下标,则符合条件的上升序列可以分为两段:[1,i] 中以 i 为结尾的上升子序列 及 [i,x) 中以 i 为开头的上升子序列。

前者很好算,后者则是 [i,n] 中以 i 为开头的上升子序列个数 减去 [i,x] 中以 i 为开头,x 为结尾的上升子序列个数。

考虑枚举每一个 x。符合条件的 x 一定满足其等于后缀 max。那么对应的 i 一定在这个 x 到下一个 x 之间,直接抽取出来做即可。

时间复杂度 O(nlogn)

P6944/LOJ3405 [ICPC2018 WF]Gem Island

洛谷这么有实力的吗

考虑最后每个人拿(增加)的绿宝石数量 ai,其概率为:

(da1,a2,,an)a1!a2!an!n(n+1)(d+n1)=1(d+n1n1)

所以只需要对 {a} 统计即可。

考虑一个不知道怎么想到的套路的 DP。设 fi,j 表示将 i 有序拆分成 j 个非负整数的方案数,gi,j 表示将 i 有序拆分成 j 个非负整数的前 r 大和。

枚举有 k 个数为正整数,并将它们减去 1。于是有:

fi,j=k(jk)fik,k=(i+j1i1)

gi,j=k(jk)(gik,k+min{r,k}fik,k)

时间复杂度 O(nd2)


我们发现根本就不想这么 DP,这种问题应该考虑容斥。

fi,j 表示恰好有 i 个数大于等于 j,则答案即为 i,jmin{i,r}fi,j

gi,j 表示钦定有 i 个数大于等于 j,则 gi,j=(ni)(dij+n1n1)

gk,j=ik(ik)fi,j

fk,j=ik(1)ik(ik)gi,j=ik(1)ik(ik)(ni)(dij+n1n1)

这里有 jkdijd,可以枚举 jO(id2i2)=O(d2) 计算。


我不满意!还可以进行一些优化。

ANS=kmin{k,r}i(1)ik(ik)(ni)j(d+nij1n1)

改为枚举 i

ANS=i(ni)[j(d+nij1n1)][k(1)ikmin{k,r}(ik)]

后面两部分分开预处理。

前面部分可以用狄利克雷后缀差分,时间复杂度 O(nloglogn)

后面部分:

k=1dmin{k,r}(1)k(ik)=k=1min{d,r}k(1)k(ik)+rk=r+1d(1)k(ik)

t=min{d,r},实际上是要算:

fi=k=1t(1)k(ik)=(1)t(i1t)1

gi=k=1tk(1)k(ik)=i[fi1+1(1)t(i1t)]

hi=k=1d(1)k(ik)

可以和答案一起算,时间复杂度 O(n)

总时间复杂度 O(nloglogn)

CF1630E Expected Components (2900)

最大的问题是如何去重,直接用带权 Burnside 引理:

xwx|x¯|=1|G|gw(Xg)

设有 d 循环节的权值之和为 fd,则答案为 1ndfdφ(nd)

fn 为例,由于要算的是和之和,对每种颜色分开计算。具体而言,将该颜色看作 1,其它颜色看作 0,最后再乘上其它颜色可重排即可。

枚举 1 恰有 t 段,但若直接插板怎样不重不漏仍然是个问题。

用常见套路,枚举旋转最小角度。注意 0 位置不一定是 1,还要算 0 位置是 0 的情况。最后范德蒙德卷积即可做到 O(1)

设共有 q 种颜色,则枚举的 d 数量不超过 gcd{bi}min{bi}nq,总时间复杂度是 O(n)

XXI OpenCup Grand Prix of SPb J Justice For Everyone

先考虑没有两个人不能相等的限制怎么做。

di=biais=di2

n 元生成函数 F=1i<jnxixj=12[(xi)2(xi2)],则答案为 [xidi]Fs

大力展开:

Ans=[xidi]Fs=12s[xidi][(xi)2(xi2)]s=12s[xidi]j=0s(sj)(1)j(xi2)j(xi)2s2j=12s{ei}(sei)(1)ei(eie1,e2,,en)(di2eid12e1,d22e2,,dn2en)

枚举 {ei} 显然不现实,还是用生成函数做。对 dGd=i=0d/21i!(d2i)!,则答案为:

Ans=12st=0s(st)(1)tt!(2s2t)!

回到原问题,该限制十分类似 LGV 引理的使用条件。将 Gbjai 填入矩阵,计算行列式即可得到答案。

多项式项数为 O(V2)=20000 较大,可以代值算行列式再多项式快速插值,总时间复杂度 O(n3V2+V2log2V)

PTZ Camp2022 C3 Inversions

对每个 t 暴力统计逆序对为 t 的排列数量。设 Ft(x)=i=0t1xiG(x)=t=1nFt(x),答案即为 x=0n(n1)/2ikgi

需要做 n 次值域为 n2n 的卷积,时间复杂度 O(n3)

下面假设计算期望。

如果 k=1,就是个人人都会的经典问题:每对位置有 12 的概率产生一个逆序对,因此期望为 n(n1)4

因此原问题相当于选出 k 对位置,要求每对位置都是逆序对,显然可以分情况讨论得到对应概率。这些位置至多覆盖 2k 个点,故答案一定为关于 n2k 次多项式。然而由于点可以重复,情况数太多,无法直接计算。

同暴力算出 n=12k 时的答案,直接插值,时间复杂度 O(k3),仍然无法接受。

考虑把 k 次幂用斯特林数拆成下降幂,要求即 iip_gi=G(p)(1)

对于每个 Ft(x) 这个东西很好求。Ft(p)(1)=i=ptip_=(t+1)p_p+1

由莱布尼茨公式,Gp 次导可以通过对每个 Ft 写出指数型生成函数 Pt=iFt(i)xii! 卷积得到。

注意此时只需求 x2k 以内的答案,于是时间复杂度变为 O(k3)。使用 NTT 优化即可做到 O(k2logk)

最后我们算的是期望,还要乘上 n! 得到原来的答案,打个表即可。

PTZ Camp2022 H7 Hundred Thousand Points

随机变量不能当离散变量考虑。

首先由于 ai>360 一定无解,所以 NO(M) 的。

容易发现 2n1 的角一定被完全包含在上半平面或下半平面,可以对 1n 的情况分类讨论,然后背包处理。

考虑如何分配空位计算答案,设上半平面的角共有 num1 个,和为 val1;下半平面的角共有 num2 个,和为 val2,则分配空位的概率为:

(180val1)num1(180val2)num2num1!num2!

(即先将角紧密排成一排,再在空位中插入 num 个断点分配给每个空隙)

  • 1n 同样不跨越水平线。此时所有变量都可以一视同仁,直接 DP 记录 numval (本质是卷积)再计算答案即可。

  • 1 跨越水平线,而 n 不跨越水平线。先对 2n DP,设 1 在上半平面的角度为 x,则答案即为:

1num1!num2!0ai(180val1x)num1(180val2a1+x)num2dx

n 跨越水平线,1 不跨越水平线的情况翻转同理。

  • 12 均跨越水平线。类似答案为:

1num1!num2!0a10an(180val1xy)num1(180val2a1an+x+y)num2dxdy

改为对 z=x+y 积分。不妨设 a1an,则 z 的贡献系数长这样:

综上,设 M=180,卷积部分 O(M3),积分统计答案 O(M4)(听说可以 NTT 优化到 O(M3logM))。

细节:积分时需要注意变量的上下界。

CF773E Special Positions (3300)

先把期望拆开,对每个位置算贡献。考虑第 i 个位置,设 m 个关键点到它的距离排序后为 d1,,dm,则贡献为 i=1mdi2i

然而由于 i 左右都有关键点,不方便排序,难以处理。

考虑不排序,直接计算 ji 的贡献。设 pt 表示 t 是否为关键点,cntt=i=0tpipret=2cntt

先考虑 j<i 的情况,贡献为 j<ipj(ij)prej1pre2ij=ij<ipjprej1pre2ijj<ijpjprej1pre2ij,两边分别做。

如果没有 j<i 的限制就能直接卷积了。用 CDQ 分治(好像就是分治NTT),每次让左区间的点做 NTT 贡献右边即可。

j>i 的情况翻过来同理,注意 j2ij 都是关键点时会算重,改为计算 j<ipj(ij)prej1pre2ij1 即可。

时间复杂度 O(nlog2n)

P8114 [Cnoi2021]六边形战士

Part 1

二分图完美匹配看起来难以处理……

一个奇特的想法:将所有灰边(非匹配边)割开,将每条匹配边分离开来,画一画:

十分的有立体感?不妨再把三种方向的菱形染成不同颜色:

事实上,原图的一种二分图完美匹配对应一种 a×b×c 的立方形堆叠。证明见

现在题目变成了立方体堆叠计数。这是经典问题,画出 1c 的轮廓线,限制仅是轮廓线不能互相穿过:

将第 i 条线的起点和终点都向右上平移 i 格,这样就变成了轮廓线不能相交。

考虑 LGV 引理,第 i 个起点到第 j 个终点的方案数为 (a+ba+ij)。因此答案为:

ANS=det((a+ba+ij))i,j


Part 2

把每一行拎出来提系数。第 i 行为 (a+ba+i1),(a+ba+i2),,(a+ba+ic),提出 (a+b)!(a+i1)!(b+c1)! 就得到 (a+i1)!(a+ij)!(b+ci)!(b+jj)!=k=1j1(a+ik)k=jc(b+ki)

ANS=(i=1c(a+b)!(a+i1)!(b+ci)!)det(k=1j1(a+ik)k=jc(b+ki))i,j=i=1c(1)ci(i=1c(a+b)!(a+i1)!(b+ci)!)det(k=2j(a+ik+1)k=jc(ibk))i,j

套用题目给出的 Krattenthaler’s formula

det(k=2j(xi+ak)k=j+1n(xi+bk))i,j=1i<jn(xixj)2ijn(aibj)

ANS=(1)c(c1)/2(i=1c(a+b)!(a+i1)!(b+ci)!)1i<jc(ij)2ijc(ai+b+j+1)

枚举 ij

1i<jc(ij)=(1)c(c1)/21i<jn(ji)=(1)c(c1)/2t=1c1tct=(1)c(c1)/2t=1c1t!

2ijc(ai+b+j+1)=t=0c2(a+b+1+t)c1t=t=1c1(a+b+t)ct=t=1c1(a+b+t)t_

到这里已经可以 O(n) 计算了。

我不满意!

ANS=(i=1c(a+b)!(a+i1)!(b+ci)!)t=1c1t!t=1c1(a+b+t)t_=i=1c1(a+i1)!(b+ci)!t=1c1t!t=1c1(a+b+t)!

H(n)=i=0n1i!,就有:

ANS=H(a)H(b)H(c)H(a+b)H(b+c)H(c+a)H(a+b+c)

总时间复杂度 O(n)

LOJ6215「美团 CodeM 决赛」bt

首先不得不考虑 u=v 的情况,即为二叉树叶子个数之和。简单推一推可得 (2(n1)n1)

k 次幂难做,套路拆成下降幂及组合数:

lk=i=0ki!S2(k,i)(li)

转而数其组合意义。相当于在 uv 的路径上特殊标记了 k 个点,再数方案数。

考虑大力设出生成函数,多加一维 y 表示标记个数。设 F0,F1,F2 分别表示子树内包含 u,v0,1,2 个点的生成函数(为了方便,这里不计算 u,v,lca 的贡献,最后乘上 x3(1+y)3 即可)。有:

F0=1+xF02

F1=1+2x(y+1)F0F1

F2=F12+2xF0F2

大力解得:

F0=114x2x

F1=1y(y+1)14x

F2=114x(y(y+1)14x)2

t=14x,则 F2=t3[1(t11)y]2

先将 F2 暴力展开成关于 yt1 的二元多项式,再考虑 [xn]tk=[xn](14x)k/2=[xn]i(k/2i)(4)i=(k/2n)(4)n

至于一半组合数,暴力展开或者参考 xk_(x1/2)k_=(2x)2k_22x,同样 O(1) 计算。

总时间复杂度 O(n+m2)

LOJ3626「2021 集训队互测」愚蠢的在线法官

显然若有重复的 Ai,则有两列完全相同,行列式为 0

否则,由于交换 AiAj 对行列式无影响,我们不关心 {Ai} 的顺序。为了方便,假设 Ai 是按 dfs 序排列的。

树的结构十分适合递归,考虑递归划分矩阵。

下面记两个子树对应的子矩阵中元素分别记为 AB,减去 wu 后的元素分别记为 AB

uA 中出现了,则矩阵大概长成这样:

[wuwuwuwuwuwuAAwuwuwuAAwuwuwuwuwuBBwuwuwuBB]

用第一行消元,变为:

[wuwuwuwuwu0AA000AA00000BB000BB]

注意到该矩阵的行列式即为 wu 乘上 {1} 的主子行列式。

u 没有出现,手动将矩阵内每个元素减去 wu 可以得到相同的形式。

问题变为如何快速计算某矩阵 M 内每个元素同时加上 x 后的行列式。有结论:设其为关于 x 的函数 f(x),则 f(x)=ax+b。其中 b=det(M)aM 的所有代数余子式之和。

详细推导如下:

det(M)=P(1)σ(P)i(Mi,Pi+x)=S[n]x|S|P(1)σ(P)iSMi,Pi

|S|2 时,交换 P 中不在 S 中的两个元素,贡献会抵消。只考虑 |S|=0/1 的情况。

det(M)=det(M)+xt=1nP(1)σ(P)itMi,Pi

后面的系数即为 M 的所有代数余子式之和。

因此 DP 记录 fu=agu=b。具体过程为:设递归到该层时所有元素已减去 del,先将子矩阵中的元素减去 wudel 递归得到 DP 值,再合并,最后加回减去的 wudel

转移时行列式直接相乘。考虑代数余子式,若选在两个子矩形以外的位置,则贡献为 0。否则为其中一个子矩阵的行列式乘上另一个子矩阵的代数余子式

gufugv+fvgufufufv

总时间复杂度 O(n)。叶节点需要特判,有些细节。

LOJ3395「2020-2021 集训队作业」Yet Another Permutation Problem

与 ARC134F 也太像了吧

考虑如何判断一个排列能否在 k 次操作内得到。显然充要条件为 存在连续 nk 个单调递增的数

容斥,计算所有极长单调递增连续段长度都小于 p=nk1 的排列个数。

后面的限制是简单的,可以直接对段长设生成函数 F=i=0pxi=1xp+11x 并卷积;然而极长连续段的限制难以处理(直接卷会算重)。

使用同 ARC134F Flipping Coins 的方法,给每个长度赋一个新的权组成生成函数 A,并使 A 任意组合后正好为 F

11A=F

A=11F

于是答案就是 n![xn]11A^。暴力实现 O(n3)

注意到 1F=1x1xp+1=d(1x)xd(p+1) 只有 O(np) 项,因而对 F 求逆的复杂度为 O(nnp)。可以接受。

总时间复杂度 O(n2lnn)

2021ICPC 上海站 (GYM103446) B Strange Permutations

iPi 连边,合法的 Q 即不存在相邻的两个数 QiQi+1 相连。

大力对边容斥,若钦定了 k 条边必须在 Q 中相邻,则对应方案数为 (nk)!(每一条边相当于把两个位置合并)。

接下来只需要对每个 k 算出钦定 k 条边的方案数。对每个环,设其长为 l,则写出生成函数 F=(1+x)lxl,将所有 F 卷起来即可得到答案。

使用分治乘,时间复杂度 O(nlog2n)

2021CCPC 广州站 (GYM103415) K Magus Night

意识到 lcmp 十分的怪异(因为 lcm 可以非常大) ,于是考虑容斥,计算 gcdq 的方案减去 gcdqlcm<p 的方案。

第一个问题非常好算。设 fd 表示 gcd=d 的方案,gd 表示钦定每个数都被 d 整除的方案。则:

gd=idfi

可以莫比乌斯反演得到 fd=idμ(di)gi

第二个问题用同样的方法,现在需要对每个 d 求出每个数都被 d 整除且 lcm<p 的方案,即任意选数 lcmp1d 的方案。

再套容斥,设 pd 表示 lcm=d 的方案,qd 为钦定每个数都整除 d 的方案(可以通过算约数和处理)。则:

qd=dipi

可以用倍数莫比乌斯反演得到 pd=diμ(id)qi

总时间复杂度 O(m(lnm+logn))

LOJ3393「2020-2021 集训队作业」Game on Tree

u 子树内叶子节点集合为 Lu,到 1 号点深度为偶数的非叶节点集合为 Au,深度为奇数的非叶节点集合为 Bu

考虑 DP。设 fu,i,j 表示 u 的子树合法,Alice 的最优值为 i 且 Bob 的最优值为 j 的方案数。xu,i 表示 u 的子树中 Alice 的最优值不超过 i 的方案数;yu,i 表示 u 的子树中 Bob 的最优值不超过 i 的方案数。

考虑转移,不妨设 uAlr 分别表示左右儿子,考虑 Alice 选择接在哪边,则有:

fu,i,j=fl,i,jxr,i+fr,i,jxl,i

xu,i=2xl,ixr,i

yu,i=2|Ar|+|Br|k2|Lr|yl,i+2|Al|+|Bl|k2|Ll|yr,i

注意到 xy 似乎关联性不大。考虑做一些变换使 xy 独立。

朴素的想法是令 xu,i=xu,i/(2|Au|+|Bu|k2|Lu|i)yu,i=yu,i/(2|Au|+|Bu|k2|Lu|i),然而带入第三个式子后会出现 /2(因为 Au=Al+Ar+1),模数不为质数难以处理。

AB 分开在 xy。令 xu,i=xu,i/(2|Au|k|Lu|i)yu,i=yu,i/(2|Bu|k|Lu|i),则递推式变为:

fu,i,j=2|Ar|k2|Lr|fl,i,jxr,i+2|Al|k2|Ll|fr,i,jxl,i

xu,i=ixl,ixr,i

yu,i=2|Ar|k|Lr|yl,i+2|Al|k|Ll|yr,i

这时发现 fu,i,j=xu,iyu,j,边界条件为 xleaf,i=yleaf,i=1,答案即为 (xu,i)(yu,i)

视多项式 Fu(x) 满足 Fu(i)=xu,i。由于上述转移过程中每次只会使多项式系数 +1,所有节点系数的多项式至多为 n1。可以 O(n2) 处理 0n 的点值,再用拉格朗日插值得到答案。

具体而言,考虑拉格朗日插值公式:

F(x)=i=0nyijixxjxixj

预处理出 li(k)=jikxjxixj,每个询问带入求值即可。然而模数不是质数,无法取逆。

注意到拉格朗日基本多项式 li(x)i 处为 1,在 [0,n]{i} 处为 0,故其为整值多项式,一定可以表示为 t=0nct(xt)(ctZ) 的形式。

有:

yp=t=0pct(pt)=[p=i]

cp=t=0p(1)ptyt(pt)=(1)pi(pi)

li(k)=t=in(1)ti(ti)(kt)

只要处理出 (kt) 即可。

不断将组合数乘上 ki+1,再除掉 i,运算过程不会出现分数。故将一个数分成两部分:其含 p 的质因数的指数 及 与 p 互质的部分,即可通过欧拉定理求逆。

时间复杂度 O(n2)

LOJ3630「2021 集训队互测」Imbalance

记前缀和为 {si}。考虑 {sisik},其为连续变化的(即差值在 [1,1] 间),故要么所有 sisik<k2,要么所有 sisik>k2。不妨考虑第一种情况,第二种情况反转同理。

将所有第 i 个点画到第 imodk 个位置上,会形成 nk 条折线。再将第 t 条折线向下平移 tk2(即对应 (imodk,siikk2)),则原条件转化为 nk 条折线两两不交。

...

CF1654H Three Minimums (3500)

标记记号 check[i,<]=[i>msi=<]check[i,<]=[i>msi=>]

考虑一个序列是否是好的:

  • 1 不在两端,设 pi=1,则 p[1:n] 合法当且仅当 p[1:i]p[i:n] 合法;

  • 1 在两端(不妨设 p1=1):

    • 2 不在另一端,设 pj=2,则 p[1:n] 合法当且仅当 p[1:j]p[j:n] 合法。

    • 否则 pn=2,则 p[1:n] 合法当且仅当 「p2=3p[2:n] 是好的」 或者 「pn1=3p[1:n1] 是好的」。

于是设计一个区间 DP。设 a(l,r),a1(l,r),a1(l,r),a12(l,r),a21(l,r) 分别表示对于区间 (l,r),满足给定条件的「区间两端无限制」,「区间左端点为最小值」,「区间右端点为最小值」,「区间左端点为最小值,右端点为次小值」,「区间左端点为次小值,右端点为最小值」的方案数。于是有:

a(l,r)=i=lra1(l,i)a1(i,r)(rlil)

a1(t,t)=1,a1(l,r)=i=l+1ra12(l,i)a1(i,r)(rl1il1)

a1(t,t)=1,a1(l,r)=i=lr1a1(l,i)a21(i,r)(rl1il)

a12(t,t+1)=check[t,<],a12(t,t+2)=check[t,<]check[t+1,>],a12(l,r)=check[l,<]a21(l+1,r)+check[r1,>]a12(l,r1)

a21(t,t+1)=check[t,>],a21(t,t+2)=check[t,<]check[t+1,>],a21(l,r)=check[l,<]a21(l+1,r)+check[r1,>]a12(l,r1)

暴力做时间复杂度 O(n3),无法接受。


答案为 a(1,n),故要对所有 k[k,n] 计算出 a1(1,k)a1(k,n)

Part 1:a1(1,k)

DP 式为 a1(1,1)=1a1(1,k)=i=1k1a1(1,i)a21(i,k)(k2i1)

观察到给左右两边的 a1 同乘阶乘会使形式简化许多。设 a1(1,k)=(k1)!xk1,x0=1,则有:

(k1)!xk1=i=1k1(i1)!xi1a21(i,k)(k2)!(i1)!(ki1)!

(k1)xk1=i=1k1xi1a21(i,k)1(ki1)!

kxk=i=1kxi1a21(i,k+1)1(ki)!

kxk=i=0k1xia21(i+1,k+1)(ki1)!

这个形式很好看,但是 a21(i+1,k+1) 有两个变量而难以处理。

注意到限制只在前 m 位处,故对于 l>m 的状态,其 DP 值只与长度 rl+1 有关。设 b??(k)=a??(m+1,m+k)。上式就可以改写为:

kxk=i=0k1xib21(ki+1)(ki1)!+i=0min(k1,m1)xia21(i+1,k+1)b21(ki+1)(ki1)!

ui=b21(i+2)i!vk1=i=0min(k1,m1)xia21(i+1,k+1)b21(ki+1)(ki1)!。则:

kxk=vk1+i=0k1xiuki1

写成生成函数就是 X=V+UX,解这个微分方程得到 X=exp(U)[1+(Vexp(U))]

注意到 b21(k)=2k2+[k=1],对所有 l[1,m+1]r(l,n] 暴力 DP 出 a21(l,r) 即可得到 b21(k),再对所有 t[1,m] 暴力 DP 得到 xt,即可计算 UV

Part 2:a1(k,n)

注意到 k>ma1(k,n)=b1(nk+1),考虑先求出 b1(k),求出后可对 k[1,m] 暴力 DP 出 a1(k,n)

DP 式为 a1(n,n)=1,a1(k,n)=i=k+1na12(k,i)a1(i,n)(nk1ik1),即:

b1(k)=i=2kb12(i)b1(ki+1)(k2i2)=i=1k1b1(i)b12(ki+1)(k2i1)

b1(k)=(k1)!yk1,代入:

(k1)!yk1=i=1k1(i1)!yi1b12(ki+1)(k2)!(i1)!(ki1)!

(k1)yk1=i=1k1yi1b12(ki+1)(ki1)!

kyk=i=1kyi1b12(ki+2)(ki)!

kyk=i=0k1yib12(ki+1)(ki1)!=i=0k1yiuki1

于是有 Y=UY,解得 Y=exp(U)

总时间复杂度 O(n(logn+m))

CF1616H Keep XOR Low (3000)

小于等于不好算,改为小于 x+1。首先处理出 x 的最高位,显然不能选两个高位不同的 ai,故将所有 ai 按高位分类。

对所有 ai 建出字典树,设 sizu 表示 u 节点子树内的 ai 个数。下面设 u1=ls(u)u2=rs(u)

考虑递推,设 fu,v 表示 选出 u 子树内一些数(不能不选)并选出 v 子树内一些数(不能不选)组成的合法答案数量,则:

fu,v=fu1,v1+fu2,v2,xdepu=0

fu,v=fu1,v2fu2,v1+fu2,v1(2sizu1+2sizv21)+fu1,v2(2sizu2+2sizu11)+(2sizu11)(2sizv11)+(2sizu21)(2sizv21),xdepu=1

容易发现一个 u 对应的 v 是唯一的,故状态数量与节点数量同阶。

时间复杂度 O(nlogai)

CF1119H Triple (3200)

鸽了好久没写,已经被问过3遍了

[xS]t=1n(i=1kpixat,i)

暴力即对每一层做 FWT,再点积起来做 IFWT。

考虑到只有 k 种值,故 IFWT 后也只有 2k 种值。只要算出每个位置上每种值的层数,就能得到答案。

下面定义一种新变换 ST 的贡献系数为 ST=|ST|mod2

fmask,S 表示 S 中的元素恰好贡献到 mask 的层数,即:

  • iS,at,imask=1

  • iS,at,imask=0

再设 gmask,S 表示满足 (iSat,i)mask=1 的层数。容易通过 FWT 得到,该部分复杂度 O(m2m+k)

考虑 gS 会被哪些 fT 统计到。由 (iSat,i)mask=1

[(iSTat,i)mask][(iSTat,i)mask]=1

(iSTat,i)mask=1

|ST|mod2=1

ST=1

故对 F 变换即得到 G,对 G 逆变换即得到 F。该部分复杂度 O(k2m+k)

容易发现 变换与 FWTxor 变换是线性关系,故将 变换替换为 FWTxor 变换是等价的。

总时间复杂度 O(n2k+(m+k)2m+k)

PTZ Camp2022 B6 Gachapon | PR#3 抽卡

直接 DP。考虑计算 t 的答案,设 fi,j 表示 i 级合法抽卡抽出的卡等级不超过 j 的概率,gi,j 表示 i 级合法抽卡抽出的卡等级不超过 j 的情况中抽到 t 的期望次数。

转移期望时,由于每个子树相同,可以只计算一个子树的贡献,再乘上 bi

fi,jfi1,jbifi1,i1bi

gi,jbi(gi1,jfi1,jbi1gi1,i1fi1,i1bi1)

答案即为 gn,m

枚举 t,时间复杂度 O(nm2logb)

注意到对于不同的 t,答案状态是相同的。且计算出 fg 的转移是线性的。直接将 gn,m 设为 1,倒推即可。

时间复杂度 O(nmlogb)

技巧:动态规划倒推。将转移视为带权边,则产生一张 DAG。定义路径的权为其中所有边权之积。
设初始状态为 S,终止状态为 T。将 S 的 DP 值设为 1,则 T 的 DP 值可视为 ST 的所有路径权值和。
故将所有边反向,权值不变,将 T 的 DP 值设为 1,倒着转移可在 S 处得到原先终止状态的 DP 值。

P7519 [省选联考 2021 A/B 卷] 滚榜

显然对每种最终排列计算其对应的最少过题数量,与 m 比较即可判断是否合法。

设排列为 p1,p2,,pn,定义 p0ai 最大的中最靠前的 i。设 bi 表示在合法前提下 pi 的最少过题数量,则有:

  • bi=bi1,api>api1

  • bi=bi1+api1api+[pi1<pi],apiapi1

注意到 {bi} 单调不降,且每次增量与 bi1 无关。于是在每次加入 pi直接预先给后面所有的 bi 加上增量,就不必再记录上一个 bi 的值。

考虑状压 DP,从前到后填 {pi}。设 fS,i,j 表示已经填了 S 里的数,最后一个填的数为 i,目前 bi 的和为 j 的方案数,直接转移即可。

时间复杂度 O(n2m2n),空间复杂度 O(nm2n)

PTZ Summer 2021 Day 1 G Generate the Sequences

理解一下题意立即发现题目等价于:

有一变量 x=0,每次可以令 xx+m21 种方案),xx1 种方案) 或 xx1x 种方案)。求操作 n 次方案数。

然而 x 的值难以维护,至少要记录 1,3 操作的次数,只能做到 O(n3)

注意到 1,3 操作与 2 操作是几乎独立的,可以分开考虑,按 1,3 操作 DP 再统计 2 操作的方案数。

考虑类似 ARC112E Cigar Box,对于每次 2 操作不立刻进行,而是将其操作的时间延后。于是每次只需考虑在之后的操作中选出一些做 2 操作。

fk 表示剩下 k 次操作,已经进行的操作的方案数。考虑下一次是 1 操作还是 3 操作,则:

fk1fk

fki1(k1i)(m2i)fk

时间复杂度 O(n2),显然可以用分治 FFT 优化至 O(nlog2n)

PTZ Summer 2021 Day 1 M Multiple Parentheses

C(x) 表示卡特兰数的生成函数,则答案为:

[xm][C(x)ckxk]n

常数很小的多项式快速幂能过吗

拆开(或容斥)后只需快速计算 S(n,k)=[xn]Ck(x) 即可。

结论:

[xn]Ck(x)=(k1+2nn)(k1+2nn1)=kk+n(k1+2nn)

组合证明:相当于 k 个合法括号拼起来。尝试建立其与由 (0,k1) 走到 (2n+k1,0)Dyck 路径的双射:

  • 括号序列组 路径:依此按照每个括号序列行走,在走完每个括号序列后额外向右下走一步。
  • 路径 括号序列组:取所有前缀 min 作为断点将整条路径分为 n 条路径,从而对应括号序列组。

时间复杂度 O(n+m)

PTZ Winter 2021 Day 8 G Biological Software Utilities

不会组合做法

考虑如何判断一棵树是否为二分图。可以类似拓扑排序不断删掉叶子,看是否能删空。

具体而言,设 dpu 表示 u 是否与子树内的匹配。则:

dpu={1,00,1

若子树内有多个 1 则整棵树不合法。

上生成函数。设 F(x),G(x) 分别表示根的 DP 值为 0,1有标号有根树的指数型生成函数。则:

F(x)=xG(x)expF(x)

G(x)=xexpF(x)

于是 F(x)=G(x)2,代入得:

F(x)=xexpF(x)

lnF(x)x2=2F(x)

注意 F(x) 只在偶数项有值,令 F(x)=P(x2),则:

lnP(x2)x2=2P(x2)

lnP(x)x=2P(x)

Q(x)P(x) 的复合逆。

lnxQ(x)=2x

xQ(x)=e2x

由拉格朗日反演:

P(x)=1n[xn1](xQ(x))n=1n[xn1]e2nx=(2n)n1n!

fn=nn/21(n/2)!(2n)

答案即为:

Ans={0,2n(n1)!nn/21(n/2)!,2n

总时间复杂度 O(n)

LOJ6495 「雅礼集训 2018 Day1」树

为什么网上全是 n^4 | 为啥不出 n=1000

假装没有第一问,不考虑精度问题。

从上往下 DP,设 fi,j 表示子树大小为 i,深度为 j 的方案数。考虑根的最前面的儿子,转移即:

fi+j,max(p,q+1)(i+j2i1)fi,pfj,q

枚举 i+j 分层转移,朴素转移 O(n4)

注意到第二维相当于 max 卷积,前缀和/差分优化即可做到 O(n3)

注意到第一维相当于多项式卷积,再上个 NTT 即可做到 O(n2logn)

LOJ3120 [CTS2019] 珍珠

c=min(d,n2m),相当于要求出现奇数次的颜色不超过 c 种。

Ans=[xn]i=0c(di)(exex2)i(ex+ex2)di=2d[xn]edi=0c(di)(e2x1)i(e2x+1)di

F(x)=i=0c(di)(x1)i(x+1)di,则 Ans=2di=0d(2id)n。下面考虑计算 F(x)

F(x) 是 D-finite 的,考虑对其求导:

F(x)=i=0c(di)i(x1)i1(x+1)di+i=0c(di)(di)(x1)i(x+1)di1

dF(x)=i=0c(di)i(x1)i(x+1)di+i=0c(di)(di)(x1)i(x+1)di=(x1)i=0c(di)i(x1)i1(x+1)di+(x+1)i=0c(di)(di)(x1)i(x+1)di1=xF(x)+i=0c(di)(di)(x1)i(x+1)di1i=0c(di)i(x1)i1(x+1)di=xF(x)+i=0c(di)(x1)i1(x+1)di1[(di)(x1)i(x+1)]=xF(x)+i=0c(di)(x1)i1(x+1)di1[d(x1)2ix]=xF(x)+di=0c(di)(x1)i(x+1)di12dxi=0c(d1i1)(x1)i1(x+1)di1=xF(x)+d{i=0c(x1)i1(x+1)di1[(x1)(di)2x(d1i1)]}=xF(x)+d{i=0c(x1)i1(x+1)di1[(x1)(d1i)(x+1)(d1i1)]}=xF(x)+d{i=0c(d1i)(x1)i(x+1)di1i=0c(d1i1)(x1)i1(x+1)di}=xF(x)+d{i=0c(d1i)(x1)i(x+1)di1i=0c1(d1i)(x1)i(x+1)di1}=xF(x)+d(d1c)(x1)c(x+1)dc1

(dϑ)F(x)=d(d1c)(x1)c(x+1)dc1。设 a=c,b=dc1,只需快速计算 G(x)=(x1)a(x+1)b 即可。

G(x) 也是 D-finite 的,对其求导:

G(x)=a(x1)a1(x+1)b+b(x1)a(x+1)b1=G(x)(ax+1+bx1)

(x21)G(x)=[(a+b)x+(ab)]G(x)

(i+1)gi+1=(ab)gi+(a+bi+1)gi1

于是可以线性递推。

计算答案时,求 in 可以线性筛,复杂度 O(dlognlnd)=O(dlogdn)

总时间复杂度 O(dlogdn)

LOJ2554「CTSC2018」青蕈领主

显然若将每个 i 对应的区间 [iai+1,i] 画出,这些区间一定形成树的结构,否则不合法。

具体而言,区间 [iai+1,i1] 一定能被分成若干极长连续的子区间(即儿子)。可以将每个子区间看成一个数,故设子区间个数为 sonu,只需要求出形如 1 1 ... 1 n+1 问题的答案 fn,答案即为 ufsonu

利用递归的结构,设 G(x)=i=1+i!xi,则有:

G(x)=xF(G(x))+x

F(G(x))+1=G(x)x

R(x)G(x) 的复合逆,代入 R(x) 可得:

F(x)=xR(x)1

接下来只需要求 R(x) 即可。注意到 G(x) 是 D-finite 的,可知 (x1)G(x)+x2G(x)+x=0,代入 R(x) 得:

x(R(x)1)+R(x)2G(R(x))+R(x)=0

1=G(R(x))=R(x)G(R(x))

x(R(x)1)+R(x)2R(x)+R(x)=0

xR(x)R(x)xR(x)+R(x)2+R(x)R(x)=0

i=1n1irirni+i=1n1rirni+i=1nirirn+1i=nrn

rn=i=1n1(i+1)rirni+i=2n1irirn+1i

分治 FFT 即可。时间复杂度 O(nlog2n)

LOJ3726「SDOI / SXOI2022」多边形

对一条边考虑,关注边上的顶点(不含两端)。由于允许这些点不连边,先枚举哪些点连边。

n 边形的三角剖分有 Catalan(n2) 种,但如果存在原本在同一条边的两个点连边就会不合法。

考虑容斥。记恰跨过一个(选中的)点的边为 关键边,注意到不合法的方案至少包含一条关键边,且不同的关键边方案对应的一定是不同的方案,故可以按关键边数量容斥。

设这条边上有 a 个顶点(不含两端),fi 表示剩下 i 个顶点(不含两端)的方案数。枚举选中了 k 个点,插板可得:

fi=k=ia(1)ki(ak)(i+1ki)

最后只需要将所有 Fa(x) 乘起来再乘上对应的卡特兰数统计答案即可。接下来考虑如何快速计算 Fa(x)

fi=[xai]k=ia(ak)xak(i+1ki)(x)ki

fi=[xai](1+x)a(1x)i+1

Gk(x)=(1+x)a(1x)k。注意到 Gk(x) 是 D-finite 的,对其求导:

Gk(x)=Gk(x)(a1+xk1x)

(1x2)Gk(x)=a(1x)Gk(x)k(1+x)Gk(x)=(ak)Gk(x)(a+k)xGk(x)

(i+1)gi+1=(ak)gi(k+ai+1)gi1

于是记录相邻两项系数,可以 O(1) 推出前后项。

同时有 Gk+1(x)=(1x)Gk(x),故可以推出 Gk(x) 的三项,再推出 Gk+1(x) 的两项。

类似莫队转移,可以 O(a) 计算出 Fa(x)。该部分总时间复杂度 O(at)

总时间复杂度 O(atlog2at)

LOJ3397「2020-2021 集训队作业」春天,在积雪下结一成形,抽枝发芽

析合树的构成具有以下性质:

  • 析点的儿子全为合点。

  • 合点的合点儿子必须反向。

设有 i 个叶子节点,根节点为析点的菊花形析合树的数量为 fi,根节点为合点的数量的析合树数量为 2gi(即只统计单调上升),排列的生成函数为 H(x)(无常数项)。

由上述性质,对应到生成函数上即为:

G(x)=i2(H(x)G(x))i=11H(x)+G(x)1H(x)+G(x)

F(H(x))=H(x)2G(x)x

由第一条式子,

(1+H(x))(1H(x)+G(x))=1

G(x)=H2(x)1+H(x)

R(x)H(x) 的复合逆,代入得 G(H(x))=x21+x。再代入第二条式子:

F(x)=xx21+xR(x)

于是只需计算 R(x) 即可。

LOJ2554「CTSC2018」青蕈领主,使用分治 NTT,时间复杂度 O(nlog2n)

CF1691F K-Set Tree (2500)

拆贡献,考虑在以 r 为根时 x 没有贡献当且仅当将 ru 的链删掉后,所有选出的点都在剩下的一棵子树内。算出方案数后用总数减掉即为答案。

不换根。若枚举每个 x 难以统计删链后的子树信息,直接考虑每棵子树的贡献。下面设 fau 的父亲,有两种情况:

  • u 为根的子树,则要求链经过 fa 且不经过 u。不合法的情况即为 xr 都在以 fa 为根的同一棵子树内(且不在以 u 为根的子树内)。

  • u 为根的子树补,则要求链经过 u 且不经过 fa。不合法的情况即为 xr 都在以 u 为根的同一棵子树内(且不在以 u 为根的子树补内)。

预处理每个点的子树大小 sizufu 表示删掉 u 后在剩下的某棵子树内选 k 个点的方案数。则容易计算上述方案数,总时间复杂度 O(n)

CF1667E Centroid Probabilities (3000)

设点 k 子树大小超过 (n1)/2 的方案数为 fk。由于重心是唯一的,故点 k 为重心的方案数为 (n1)!fki=k+1n1i1fi。只需要快速计算 fk 即可。

枚举 fk 的子树大小为 i,有:

fk=(k1)!i=(n+1)/2nk(nki1)(i1)!(ni1)!(k2)!=(nk)!k2i=(n+1)/2nk(ni1)!(nki+1)!

fk=(nk)!k2i=(n+1)/2nk(ni1)k2_

而后面这个东西就是有限积分(或叫整数裂项),可以这样算:

i=knik_=1k(n+1)k_

总时间复杂度 O(n)

CF1672G Cross Xor (3200)

首先肯定要分析能被操作到的矩阵的性质。

将所有合法矩阵写成 nm 维的向量,构成线性空间 M

记在初始网格上操作 (x,y) 后得到的向量为 Px,y,显然 M 中元素都可以由 {Px,y} 线性组合出,但仍难以分析。

考虑 M 的正交补空间 M。注意到 Px1,y1Px1,y2Px2,y1Px2,y2M,其影响是只将 (x1,y1),(x1,y2),(x2,y1),(x2,y2) 反转,故若 uM,则:

x1,x2,y1,y2,ux1,y1ux1,y2ux2,y1ux2,y2=0

也就是说,若固定两行 x1,x2,则 y1,y2,ux1,y1ux2,y1=ux1,y2ux2,y2,即存在常数 c 使 ux2,y=ux1,yc。进一步可知这等价于存在 n 维向量 Am 维向量 B 使得 ux,y=AxBy

考虑如何判断 (A,B) 生成的 u 是否合法。由于 M 中元素都可以由 {Px,y} 线性组合出,只需要判断 u 是否与所有 Px,y 垂直即可。即:

x,y,uPx,y=(Ai)(Bi)(m1)Ax(n1)By=0

显然与 n,m 的奇偶性有关,分情况讨论:

  • n,m 均为偶数:条件变为 AxBy=(Ai)(Bi)

    Ax,By 都是常数且相等,生成的 u 每一位都为 0

    即所有方案合法。

  • n 为偶数,m 为奇数:条件变为 By=(Ai)(Bi)

    By 是常数且 Ai=0。生成的 u 每一行的元素都相同。考虑 vM,若将 u 中某全 1 行与某全 0 行互换,那么 v 中这两行的异或和必须相同。进一步得到 v 合法当且仅当每一行的异或和相同。

    即每一行的异或和相同的方案合法。

  • n 为奇数,m 为偶数:每一列的异或和相同的方案合法。

  • n,m 均为奇数:条件变为 (Ai)(Bi)=0

    同上面的分析,v 合法当且仅当每一行每一列的异或和相同。

    即每一行每一列的异或和相同的方案合法。


考虑计数。

  • n,m 均为偶数:答案为 2#?

  • n 为偶数,m 为奇数:枚举每一行的异或和。若该行没有 ? 则异或和已经确定,否则若有 c? 则方案数为 2c1

  • n,m 均为奇数:先枚举每一行每一列的异或和。一个元素会影响到一行及一列,可以考虑将行列看作点,元素看作边建图。

    先统计每一行每一列与目标状态的异或和作为权值。对于每一个联通块,若所有点权值异或和不为 0 则无解(连边不改变奇偶性),否则若有 V 个点 E 条边则方案数为 2EV+1(这是因为随意求出一棵生成树并确定非树边情况后,树边情况是唯一的)。

时间复杂度 O(nm)

UOJ683 【UR #22】月球车站

0 表示反面,1 表示正面,cx 表示状态 x 的第一个硬币,trx,1,trx,0 分别表示 x 选择是否反转的后继状态。则可以列出经典期望 DP:

fx=1+pftrx,1+(1p)ftr0,cx=0

fx=1+max{ftrx,0,ftrx,1},cx=1

这东西成环还带 max,不是很可做。


分析性质尝试把环和 max 去掉。假设伏特采用最优策略使步数尽可能少,即 fx=1+min{ftrx,0,ftrx,1},cx=0

类似 Dijkstra 从终止状态倒推。设当前考虑状态 uu 能转移到的两个状态分别为 x,y(其中 cx=0,cy=1 且它们除了第一个硬币外都相同)。

x 是第一次被访问到,则可以直接转移(伏特希望步数尽可能少);若 y 是第二次被访问到,那么只能转移(y 第一次访问不会被转移,而每个点只会转移到两个状态,第二次转移即为较大的那个)。

又注意到 xy 除了第一个硬币外都相同,它们被访问到的次数是相同的,故每次拓展恰有一个状态被转移。也即转移形成一条链

这里有一个不严谨之处:初始状态(即全为正面)无法作为第二次转移的 y,从而导致提前终止,某些状态没有被转移到。下面证明所有情况伏特都能使游戏在有限步内结束:

证明:称 n 次操作为一回合。在每一回合内,伏特先始终翻转,如果 skip 蚤始终不翻转,这一回合后就会结束;否则,在 skip 蚤第一次翻转后伏特将策略改为始终不翻转,这样一回合后状态倒序的字典序都会严格减小,于是游戏能在有限次操作内结束。


回到原问题,先将所有状态按照链上顺序编号(fi 的编号也对应改变)。伏特每次操作会从 u 跳到 u1x>u1,skip 蚤每次操作会从 u 跳到 u1x<u1

环差不多已经去掉了,考虑去 max,有结论:fi 单调递增。

证明:若 x<y,fx>fy,skip 蚤从 yx 过程中每次都从 u 跳到 u1,第一次到达 x 后按 fx 最优策略走。这个策略的步数 fy>fx>fy,与 fy 的最大性矛盾。

于是去掉了 max。现在转移形如 uu1ux,x>u1。同 P6835 [Cnoi2020]线形生物,将状态改为 uu1 的期望步数即可线性解决。

p=0p=1 时可能无解,需要特判。

时间复杂度 O(2n)

CF1603F October 18, 2017 (2700)

《2700》

显然只关心 x 是否为 0,因为若 x>0 可以通过变换基底化为同种情况。

  • x=0 时,即要求 n 个向量线性无关,方案数即 i=0n1(2k2i)

  • x>0 时,枚举维度为 r

先计算基底的数量。要求不能线性组合出 x 的限制比较难处理,考虑用总数减去反面。

可以从整体考虑:一组基底共可以组合出 2r1 个非零向量,而所有 2k1 个非零向量出现的概率是均等的,故能组合出 x 的基底数量即为:

2r12k1i=0r1(2k2i)=(2r1)i=1r1(2k2i)

于是不能组合出 x 的基底数量为:

i=0r1(2k2i)(2r1)i=1r1(2k2i)=(2k2r)i=1r1(2k2i)=i=1r(2k2i)

还要计算剩下 nr 个元素的数量。同 ARC133F Many Xor Optimization Problems,写出生成函数:

[xnr]i=0r112ix=(nr)2

于是答案即为:

Ans=r=0n(nr)2i=1r(2k2i)

预处理后即可 O(min(n,k)) 计算。

P7213 [JOISC2020] 最古の遺跡 3

容易发现原过程等价于以下过程:

从大到小枚举每个 i不断进行:若存在 j>i 使 aj=ai 则令 aiai1

那么也等价于以下过程:

维护一个桶 {bi},从后往前考虑每个 ai,找到最大的数 xai 使得 bx=0,如果 x>0 则令 bx=1

先认为 2n 个数互相区分,最后再除以 2n 即可。将从后往前改为从前往后,本质不变。

考虑维护数组 {ci}ci 表示剩下的数中填入后会变成 i 的数字数量。每次操作为以下两种之一:

  • 选中一个 k>0,找到最大的 xk 使得 cx0(如果找不到则 x=0),然后令 cxcx+ck1,ck0。(对应石柱最后变为 k

  • 如果 c0>0,可以令 c0c01。(对应石柱消失)

那么记 dpi,j 表示填了 i 个数,c1,,cj=0cj+10 的方案数。

转移考虑:

  • kj+1 时,算做一个无用步数,转移系数为 1(可以用 ij 可以算出 c0)。

  • k=j+1 时,枚举之前已经填好了 j+2t,那么从前面的无用步数(设为 d,也可以用 ij 算出)中取出 tj1 步用来填 j+2t(假设方案数是 pretj1),那么可以得到转移系数为 (dtj1)pretj1(tj+1)

注意到 prei 相当于没有石柱消失的方案数,再做一次 DP 预处理出来即可。

总时间复杂度 O(n3)

事实上转移式就是个卷积式,可以 NTT 优化到 O(n2logn)

LOJ3394 「2020-2021 集训队作业」Tour

先考虑 ai0 的情况。考虑以下算法:

  • 维护可重集 S={a1,a2,,an} 与变量 s 表示能放的位置数量。

  • 不断执行以下操作:令 ansanss=1,记 x,y 分别为 S 中最小值与最大值。

    • xyw,则 x 与之后填的任何数均可以相邻。从可重集中删掉 x,并令 ss+1(用掉一个位置,新增两个位置)。

    • xy>w,则 y 与之后填的任何数均不能相邻。从可重集中删掉 y,并令 ss1(用掉一个位置)。

时间复杂度 O(n)

回到原题目,只需要考虑每个极长连续符号相同段。求出将自然数/负数填进 k 段的方案数 fi/gi,答案即为 i=0min(n,m)(2figi+figi1+fi1gi)

以自然数为例。记上述算法中 s1 的值依次为 p0,p1,p2,,pn,有:

ft=i=0n1(t+pi)

可以直接分治乘再多点求值做,常数很大。

更好的做法是分治下降幂卷积,下降幂多项式容易转成点值。

总时间复杂度 O(nlog2n),常数较大。

P8554 心跳

组合对象符号化板题

%%%粉兔

考虑序列中所有前缀最大值 x1,x2,,xk,以它们为左端点将原序列划分为 k 段。

考虑每一段 [l,r] 内的 ai 取值,显然 al+1==ar=k,而对于 al 有结论:

总可以通过排列 pl+1,,pr,使得 al 取到 [k,k+rl] 的所有值。如果 l>1,还可取到 k1

bi=aik,那么每一段一定是 [1],[0,0],[1,0,0], 中的一个接若干个 0

注意到不同的 {bi} 一定对应不同 {ai},下面考虑计数 ({bi},k)

考虑对某个 {bi}k 的取值为连续区间 [L,R]。设 hn,i 表示 k 能取到 i{bi} 数量。下面求 fn,i,gn,i 分别表示 L=iR=i{bi} 个数。则有 hn,i=j=1ifn,jj=1i1gn,j

......

TopCoder 14563S RM717 Div1B DerangementsStrikeBack

先考虑如何计算错排数。

无自环环排列的指数型生成函数是:

F(x)=i2(i1)!xii!=ln(1x)x

那么错排即无自环环排列的自由组合,即:

G(x)=expF(x)=ex1x

是 D-finite 的,可以化成整式递推 O(n) 计算。

回到原问题,设现在计算 k 的答案。考虑先填 1k 的数,那么剩下的数可以随意填,方案数即 n!

若由每个 ipi(pik) 连边,那么会形成若干形如 v1>k,v2k,,vmk 的链即若干非自环的环。考虑按以下方式计数:

  • 对于每个 i>k,选择集合 Si{1,,k}。所有 Si 两两不交。

  • 对于每个 i>k,安排 Si 中元素的顺序以形成一条链,方案数为 |Si|!

  • 对于不在任何 Si 中出现的元素 tk,形成错排,方案数为 Dni=k+1n|Si|

写成生成函数即:

H(x)=(i0i!xii!)nG(x)=ex(1x)n+1

也是 D-finite 的,可以化成整式递推:

H(x)=n+x1xH(x)

hk=(n+k1)hk+hk1k

总时间复杂度 O(m)

*可能更快(dai)速(shu)的做法:容斥后再写成生成函数。

2020ICPC 济南 H Path Killer

类似 ABC242Ex Random Painting,停时期望等于所有非法状态 出现的概率 乘上 离开该状态期望时间 的和。

只需要对每个 k 求出选中 k 个点没有覆盖所有路径的方案数即可,容斥变为覆盖所有路径的方案数。

fu,i,j 表示考虑 u 的子树,还未覆盖的路径向上延申的长度为 i,已经选了 j 个点的方案数。先树形依赖背包合并,再枚举当前点是否选转移。

暴力转移复杂度 O(n5)。注意到第二维是 min 卷积,第三维是树形依赖背包,故可优化至 O(n3)

*使用 Min-Max 容斥可以做到同样复杂度,虽然一般这两种方法貌似不能同时使用。

SPOJ-RNG Random Number Generator | HDU6309 Absolute

对于定义在 R 上的函数 f(x),g(x),定义连续卷积为定义在 R 上的函数 h(x),对所有 xR 满足:

h(x)=f(t)g(xt)dt

f(x),g(x) 均为分段函数且每一段为低次多项式,可以考虑这样求解:

枚举 f(x) 中的每一段 x[l,r],f(x)=F(x)g(x) 中的每一段 x[L,R],g(x)=G(x),其中 F(x),G(x) 分别为 d1,d2 次多项式。

下面假设 r+Ll+R,否则交换 F(x),G(x)

计算二元多项式 s(t,x)=f(t)g(xt),关于 ts(t,x) 的不定积分 S(t,x)=s(t,x)dt+C

对于某个 xt 需要满足 ltrLxtR。对 t 的取值区间进行分类讨论:

  • x[l+L,r+L] 时,t[l,xL],故 h(x)=S(xL,x)S(l,x)
  • x[r+L,l+R] 时,t[l,r],故 h(x)=S(r,x)S(l,x)
  • x[l+R,r+R] 时,t[xR,r],故 h(x)=S(r,x)S(xR,x)

以上所有操作均可以在 O((d1+d2)3) 时间内完成,同时注意到若设 f(x)n 段,g(x)m 段,则分段端点至多只有 (n1)(m1) 个。故可以利用差分与前缀和在 O(nm(d1+d2)3) 内计算 h(x)

注意到 h(x) 内每一段的次数不高于 d1+d2+1,故若计算 n 个函数 f1(x),f2(x),,fn(x) 的连续卷积,设其次数分别为 d1,d2,,dn,段数分别为 k1,k2,,kn,则可以在 O((ki+1)(di+n)3) 内计算其连续卷积。

直接计算 n0 次多项式的连续卷积 h(x)(即答案的概率密度函数)。

对于 RNG,对 h(x) 每一段 [A,B] 内的部分进行积分求和即可。

对于 ABS,对 h(x) 每一段乘上 x 再积分求和即可。

总时间复杂度 O(n32n)

QOJ5031 2022集训队互测 核

先考虑如何对某个 Bf(B)。注意到 A 的每一行相互独立,设 A 中某一行为向量 a,则 a 需要满足:

aB=a

aB 的特征值为 1 对应的特征向量。那么设 B 特征值为 1 对应的特征子空间 V1 维数为 d,则 a 的方案数为 qd

下面对每个 k[0,n] 求出 V1 维数为 k 的矩阵(或视为线性变换)B 个数 fk

考虑容斥,设钦定 V1 至少 k 维的矩阵 B 个数为 gk,于是有:

gk=i=kn(ik)qfi

这是因为考虑 figk 的贡献,相当于在 k 维空间中选出 i 维子空间,方案数为 (ik)q

考虑如何计算 gk,先从 n 维空间中选出 k 维空间钦定为特征子空间(这 k 维的线性变换就确定了),方案数为 (nk)q;再对剩下的 nk 维确定一个满秩的线性变换,方案数为 i=kn1(qnqi)。于是:

gk=(nk)qi=kn1(qnqi)

由子空间反演,得:

fk=i=kn(1)ikq(ik2)(ik)qgi=i=kn(1)ikq(ik2)(ik)q(ni)qt=in1(qnqt)=i=kn(1)ikq(ik2)(nk)q(nkik)qt=in1(qnqt)=(nk)qi=0nk(1)iq(i2)(nki)qt=i+kn1(qnqt)=(nk)qi=0nk(1)nkq(i2)(nki)qq(n2)(i+k2)(q;q)nik=(nk)q(1)nk(q;q)nkq(n2)(k2)i=0nkqik1(q;q)i

hk=i=0kq(nk)i1(q;q)i,考虑 hk+1

hk+1=i=0k+1q(nk1)i1(q;q)i=i=0k+1q(nk)i1(q;q)i[1(1qi)]=i=0k+1q(nk)i1(q;q)ii=1k+1q(nk)i1(q;q)i1=hk+q(nk)(k+1)1(q;q)k+1q(nk)hk=(1q(nk))hk+q(nk)(k+1)(q;q)k+1

hk 可以线性递推,于是可以在 O(n) 内求出所有 fk

还有一个小问题:如何快速计算 k=0nfk3qkn

B=mod,对每个 i[0,B) 预处理出 3i3Bi,计算幂时直接查询即可。

总时间复杂度 O(n+mod)

本文作者:苹果蓝17

本文链接:https://www.cnblogs.com/Appleblue17/p/15841314.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   苹果蓝17  阅读(821)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起