Typesetting math: 0%

Atcoder 计数乱做

ARC132E Paw (3100)

记覆盖为左为 <-,覆盖为右为 ->,不覆盖为 =。则最后一定变成 <<<...===...>>>,且等号两侧是两个相邻的洞。

考虑对每两个相邻的洞算最后形成这种情况的概率。设左边有 LL 个洞,右边有 R 个洞。

显然左右是独立的,只考虑右边。那么只要求每次选择时,如果选到最左的,不能向左走。即有:

Fn=(112n)Fn1=ni=12i12i

概率即为 FlFr

时间复杂度 O(n)

ARC132F Takahashi The Strongest (3000)

发现 T 能赢 A 和 S 当且仅当 A 和 S 出一样的,而 T 比他们俩都大。

考虑把给出的策略扔进四元幂级数里,然后做以下运算的卷积:

xy={x,x=y3,xy

由 FWT 理论,构造变换矩阵:

[1001010100110001]

太好看了,所以随便求出逆矩阵:

[1001010100110001]

求出卷积 F 后翻转一下,现在只需要对每一个集合求 F 中与它至少有一位相同的集合数量。

容斥一下,变成每一位都不同,可以再 FWT。

总时间复杂度 O(k4k)

ABC225H Social Distance 2 (3000)

先考虑 K=0,并且要对三种情况分别算 S1(n,m)S2(n,m)S3(n,m),分别是:

  • 两旁都坐人
  • 左边坐人,右边无人
  • 两旁都无人

用一些简单的生成函数可以推导出分别是 (n+k12k+1)(n+k12k)(n+k12k1)

最后分治 FFT 卷到一起即可。

时间复杂度 O(nlog2n)

ARC101F Robots and Exits (2900)

经过 114514 分钟思考后,记 LiRi 分别为第 i 个机器人到最近左右出口的距离。

注意到方案仅在于每个机器人是从左还是右出口离开。并且如果机器人不消失的话,向左和向右是相对独立的。也就是过程一定是向左走一段,再向右走一段……

Li 排序,再设单调不降的数组 Pi,那么过程可以看作向左走 L1,再向右走 P1,再向左走 L2,再向右走 P2……

最后若 PiRi,那么机器人 i 就从左出口离开;否则从右出口离开。

现在问题被简化了许多,考虑对 Ri DP。设 dpi 表示 Pi=RiPi1<Ri 的方案数。

dpi=0j<iRj<Ridpj

注意 dp0=1

然而这样不太正确,原因在于某些机器人的 L 相同,它们的 P 也必须相同,这样后面就会算重(因为只需加一次)。

解决办法很简单,如果 Li=Li1 的话,就做个差分即可。

二维偏序用树状数组优化,时间复杂度 O(nlogn)

AGC032F One Third (4000)

考虑转化问题。认为操作是在圆周上画红点,并且每画一个红点就在顺时针 120 位置画一个绿点,在逆时针 120 位置画一个蓝点。

于是问题变为了两个异色点间最短距离期望。

按第一次画点断环为链,问题变为:

一根长度为 [0,13] 的线段的左端点为红点,右端点为蓝点。随机位置随机颜色画 n1 个点,求两个异色点最短距离期望。

显然最短的异色点对一定是相邻的,考虑枚举相邻异色点对数 k,再计算概率和条件期望相加即可。

  • 概率:只考虑同色连续段,这样相邻两个点一定异色。设以 R 开头,B 结尾的方案数为 fn,以 R 结尾的方案数为 gn,则 fn=fn1+gn1,gn=2fn1。最后再插板乘上 (nk) 即可。

  • 条件期望:异色点对连成的线段总长度期望为 k3n,由随机变量相关理论可知最短期望为 1k2×k3n=13nk

时间复杂度 O(n)

ABC236Ex Distinct Multiples (2900)

显然唯一难搞的就是 “互不相同” 条件,直接考虑容斥。

也许会考虑钦定一些点填的数必须相同,但这样需要记录若干组点集,难以实现。

不妨考虑钦定边集(两个点填的数相同即连边)。设 fS 表示恰好连 S 边的方案数,gS 表示钦定连 S 边的方案数。

显然 gS=TSfT,由子集反演得 f=S(1)|S|gS

由于边集太大,我们无法直接枚举 S 计算。但 gS 只与连接 S 后分成的若干联通块的点集有关,可以考虑枚举点集。gS 即为若干联通块的方案数相乘,可以对每个联通块分别考虑,最后直接子集卷积 exp 即可。

现在枚举 n 个点的点集 V,考虑其中所有使 V 联通的边集 S 的权值(即 (1)|S|)之和,设其为 Pn

Qn,k 表示 n 个点的点集,k+1n 的每个点都要与 1k 中某个点联通的权值之和。

  • k>1 时,考虑 1 号点与 2 号点,它们间连边与不连边的权值正好相反,于是 Qn,k=0

  • k=1 时,考虑 n 号点连出的边有 t 条,方案数为:

Qn,1=(1)n1t=1(n1t)Qn1,t=(n1)Qn1,1

Pn=(1)n1(n1)!

总时间复杂度 O(n22n)

AGC044 Random Pawn (3600)

fi 表示出生在 i 号点,最优策略下的期望分数,显然有转移式:

fi=max{Ai,12(fi1+fi+1)Bi}

然而我们并不知道转移顺序。仔细观察,不妨设 A1Ai 中的最大值,由于所有 fiA1,可得f1=A1。可以以此断环为链(新开与 1 号点相同的 n+1 号点)。

然而剩下的仍不知道转移顺序。但是观察发现如果 Bi=0,事实上只需要求出所有 (i,Ai) 构成的上凸壳,即可算出答案。

尝试做一些转换使原问题变为 Bi=0。令 gi=fiCi,则:

gi+Ci=max{Ai,12(fi1+fi+1+gi1+gi)Bi}

gi=max{AiCi,12(fi1+fi+1)+12(gi1+gi)BiCi}

我们希望对于所有 i[2,n]12(gi1+gi)BiCi=0,即 Ci+1=2Bi+2CiCi1

待定系数,设 C1=0C2=k,依次递推出 Cn1=pk+qCn=pk+q 即可算出 k=2Bnq+2qp2p

时间复杂度 O(n)

ARC134F Flipping Coins (3500)

显然 i 只会影响 pi,因此把排列拆成若干循环,循环间互相独立。接下来考虑计算循环方案数的生成函数,最后 exp 即可得到答案。

对于每个循环,再分成若干条极长单调递增的链(有序),称每条链的链尾为“坏的”(即满足 pi<i 的点),则最后向上的硬币数量就是坏点被操作的次数。

设每条链的生成函数为 F(x)=iWimod2xi,然而大力卷会算重。

我们发现不满足限制(即不是极长的)的两条链可以组成一条更长的链,尝试容斥,然而链的长度带权,无法直接容斥。

考虑一种神奇的做法:我们不直接容斥,而是给每个长度赋一个新的权,其生成函数为 A(x),再使 A 以任意方式组合起来后恰好为正确的方案数:

11A(x)=F(x)

A(x)=11F(x)

而答案的生成函数为:

ˆS(x)=exp[iˆA(x)ii!(i1)!]=11ˆA(x)

G(x)=1F(x),则 ˆS(x)=1ˆG(x)

只需要多项式求逆甚至不需要卷积,时间复杂度 O(nlogn)

一句话题解:多项式求逆

ARC133E Cyclic Medians (3300)

众所周知 E(X)=i0P(i>X)。设最后结果为 a,考虑枚举 k,算 a>k 的方案数。

>k 的数为 1k 的数为 0。则若 xi=yj,则 a 会改变;否则不变。

考虑 a 在过程中是否改变(遇到 xi=yj 即认为改变)。

  • 对于改变的情况,aA 无关,故 k=p,a=idk=Vp,a=1id 的方案数是一样的(即对称),直接除 2 即可。用总方案数减去不变情况数即为改变情况数。

  • 对于不变的情况,xy 十分有限。设 g=gcd(x,y),则 a 会经过每一对 (x,y) 满足 xy(modg)。故 xi=xi+tgyi=yi+tgxiyi(否则一定会有 xi+tg=yi)。方案数即为 [kn/g(Vk)m/g+km/g(Vk)n/g]g

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

ARC133F Random Transition (???)

Sol1

设题目给出的概率为 wa

大力 DP,用矩阵快速幂优化,可以得到 O(n3logk) 的优秀做法。(特征多项式貌似求得出来,但是转移矩阵不会快速算 t 次幂,做不动)

问题模型看起来很自然,考虑转化一下。假设求由 ab 的概率,问题等价于:

n 枚硬币,其中 a 枚硬币朝上。k 次操作,每次随机翻动一枚硬币,求最后有 b 枚硬币朝上的概率。

这样硬币间独立开了。考虑对每枚硬币写出二元生成函数,x 表示翻动次数,y 表示贡献。

F(x,y)=2ixii!y+2ixii!=12[ex(y+1)+ex(y1)]

G(x,y)=2ixii!+2ixii!y=12[ex(y+1)ex(y1)]

P=ex(y+1)Q=ex(y1),则要求的概率即为:

1k!1nk[xkyb]FaGna=1k!1nk12n[xkyb](P+Q)a(PQ)na

把括号展开,并对所有 a 求和,设 awa(P+Q)a(PQ)na=nt=0ctPtQnt,至于 ct 怎么求一会再说。

考虑 [xk]PtQnt=(2tn)kk!(y+1)t(y1)nt,故答案即为:

ANS(y)=1nk12nt(2tn)kct(y+1)t(y1)nt

惊讶地发现答案的形式与 ct 的式子是一样的!直接分治乘即可(注意 t=0 要分开算)。

总时间复杂度 O(nlog2n)

Sol1+

注意到时间复杂度瓶颈在于计算:

ni=0wi(x+1)i(x1)ni

F(x)=ni=0wi(x+1)i(x1)ni=(x1)nni=0wi(x+1x1)i=(x1)nni=0wi(1+2x1)i

W(x) 先复合 1+x,再复合 21x 即可。

时间复杂度 O(nlogn)

ABC238Ex Removing People (3200)

首先可以考虑对每段位置统计次数,然而很难处理。

删除很难搞,时间倒流变成加人。加入一个人 u 时令他面向一个方向,则该方向的邻居 v 需要在原序列中面向 u

考虑区间 DP,设 fl,rgl,r 分别表示 l 位置和 r 位置已经放好人,放 lr 间人的方案数及距离和。

c1=[Sl=R]+[Sr=L]c2i=[Sl=R](il)+[Sr=L](ri),则转移:

fl,r=i(l,r)(rl2il1)c1fl,ifi,r

gl,r=i(l,r)(rl2il1)[c2ifl,ifi,r+c1fl,igi,r+c1gl,ifi,r]

时间复杂度 O(n3)

ARC135E Sequence of Multiples (3200)

看起来很不可做(单调递增且无规律),但发现 iAi,不妨从商下手。

Bi=Aii,则有 Bi+1=iBii+1+1=Bi+1Bii+1

故有 BiBi+1=Bii+11,当 Bii+1 时值就不会再变了。

显然 {Bi} 单调不增。考虑其上界,由于 AiX+2+3++i<X+i(i+1)2,故 Bi<Xi+i

由均值不等式知 B2XBX<2X,故有 O(X) 的做法。

进一步优化,考虑按 BiBi+1 分段。下面证明这样段数不超过 O(X1/3)

  • n=X1/3,则 n 前至多 n 段;又 BnBn+1nn 后至多 n 段。故总段数不超过 O(X1/3)

具体实现,假设段首为 l,设 x=Bii+1,则对于 rx=Bl(rl)(x1)r+1,解得 r=Bl+lxx+12x1

总时间复杂度 O(X1/3)

ARC136F Flip Cells (3600)

和 ARC133F 联动

停时定理设势函数的做法做不了,因为值域有限,方程无解。

其实对于算停时的题还有另一种做法(参见 【UER #6】逃跑)。设出三个概率型生成函数:

  • F(x)ft 表示由初始状态开始,操作 t 次以后正好是第一次到达目标状态的概率。(答案即为 F(1)

  • G(x)gt 表示由初始状态开始,操作 t 次以后到达目标状态的概率。

  • H(x)ht 表示由目标状态开始,操作 t 次以后到达目标状态的概率。

由定义,有 F(x)=G(x)H(x)。只需要求出 G(x)H(x) 即可得到 F(x)

G(x) 为例。发现这个问题跟 ARC133F 几乎一模一样很相似,同样对每个格子设出其翻转偶数次及奇数次的指数型生成函数:

ˆP(x)=2i(x/nm)ii!=ex/nm+ex/nm2

ˆQ(x)=2i(x/nm)ii!=ex/nmex/nm2

对于确定的初末状态(指每个格子都已确定),直接将所有对应的生成函数卷起来即可。

然而我们现在只有初始状态,末状态可能有很多种(因为只给定了每行黑格的个数而不是具体方案)。直接对每一行 DP 求出每个指数对应的方案数,再把每一行暴力卷起来得到最终每个指数对应的方案数。(DP 复杂度为 O(nm3),卷起来复杂度为 O(n2m2)

处理完后,只需要把 nmi=nmciˆPi/nmˆQ1i/nm 展开即可。这里与 ARC133F 完全一样,直接背包 O(n2m2),分治乘可以优化到 O(nmlognm)

最后需要计算答案。上面计算的是 ˆF(x) 的指数型生成函数,将所有 eax 改为 11ax 即可转为普通幂级数。

考虑到 H(x)=(F(x)G(x))=F(x)G(x)F(x)G(x)G(x)2,需要求出 F(1)F(1)

然而 F(x) 中含有 11x 项,直接将 x=1 带入 F(x) 中会出问题。

F(x)G(x) 同时乘上 (1x)。则只有 (1x)/(1x) 项对 F(1) 有贡献,而 F(1) 的贡献可以这样求:

ddx(1x1ax)|x=1=1a1

总时间复杂度 O(n3m+n2m2)

ABC241Ex Card Deck Score (2900)

大力写出生成函数:

ANS=[xm]ni=1Bij=0(Aix)j=[xm]ni=11(Aix)Bi+11Aix

m 特别大,但是 n 很小,分子可以暴力拆开,然而分母难以处理。

用部分分式分解,设 ni=111Aix=ni=1ci11Aix。解出后即可枚举每一项计算答案。

考虑如何计算 ci。暴力展开两边:

1=ni=1ciji(1Ajx)

带入 x=A1i,则有:

1=ciji(1AjA1i)

可以 O(n2) 解出。

总时间复杂度 O(n2+n2n)

ABC231G Balls in Boxes (2600)

设操作后第 i 个球增加了 ci。则乘积为:

ni=1(Ai+ci)=S[n](tSAt)(t[n]Sct)=nm=0pmqnm

其中 pm 为任选 mAt 的乘积,可以用背包或者分治乘算出。

接下来只需要算 qm,即任选 m 个随机变量 ct 的乘积的期望。

不妨设这 m 个随机变量就是前 m 个随机变量(其余情况期望相同)。


Sol 1

ft,i 表示第 t 次是否选择第 i 个球,可以画出 k×n 的表。

等价于将前 m 个随机变量的和乘起来。将括号拆开,等价于选出有顺序mj1,,jn,并对 mt=1ft,jt 求和。

这个东西是容易的。因为若 jt 中有相同的数,则一定为 0(因为一次只能选一个数);其它情况下则为 1nm

qm=km_nm

Sol 2

设出 m 元生成函数,则答案即为 (mx1xm(x1+x2++xm)k)(1,1,,1)

常数扔出来,设 G=(x1+x2++xm),考虑偏导:

mx1xmGk=kmx2xmGk1=k(k1)mx3xmGk2==km_

故答案为 qm=km_nm


总时间复杂度 O(n2)O(nlog2n)

ARC101F Robots and Exits (2900)

假设每个机器人在二维平面内,每一步操作是向上或向右上移动一步,转化为一张 DAG。路径不交,用 LGV 引理解决。

然而终点 y1,,yk 没有确定而且无法枚举。考虑类似扫描线的 DP,一个个确定 yi,再计算下列行列式的和:

|(ny1x1)(ny2x1)(nykx1)(ny1x2)(ny2x2)(nykx2)(ny1xk)(ny2xk)(nykxk)|

转移时需要枚举最后一列拆开,需要对所有 {x1,,xk} 的子集求答案才能转移。故设状态为:

fS,t=y1<y2<<y|S|tdet((nyjxsi))i,j

其中 siS 中第 i 大的元素。

转移时,分 y|S| 是否为 t 转移:

fS,t=fS,t1+|S|i=1(1)|S|i(ny|S|xsi)fS{si},t1

边界情况为 fS,=[S=]

总时间复杂度 O(k2k(xk+n)

ABC242Ex Random Painting (2800)

设一个状态为集合 S{(li,ri)i[1,m]},称一个状态合法如果它覆盖了 [1,n]。原过程相当于不断转移状态,直到状态合法。

状态转移形成 DAG,用 ZJOI2020 抽卡 的套路,停时期望等于所有非法状态 出现的概率 乘上 离开该状态期望时间 的和。

大小为 k 的集合 走出该状态期望时间 为 mmk。故只需对每个 k 求大小为 k 的合法状态数量 fk

大力 DP,先将所有区间按字典序排序(先 lr),设 fi,j,k 表示考虑前 i 个区间,覆盖了 [1,j] 的所有格子,大小为 k 的状态数量。

直接转移时间复杂度 O(nm2)

注意到第三维 k 与给出的区间无关。设 F(x)=mi=0fixi,对于常数 C 可以通过同样的 DP 得到 F(C)

n 较大时,需要用动态开点线段树记录第二维 j 优化转移,单次 DP 时间复杂度 O(mlogn)

m+2 次 DP 得到 m+2 个点值,插值还原 {fi},时间复杂度 O(m2logn)

ARC124F Chance Meeting (3200)

为了方便,设 n=H1m=W1

容易发现 Camel 向下走与 Cat 向上走对于两人(?)的相对位置而言是等价的。将其视为同一个操作,最后乘上 (2nn) 即可。于是问题变为了:

(0,0) 出发,每次可以向上/左/右走一步,向上走 2n 步,向左与右各走 m 步后到达 (0,2n)。求在过程中恰好经过 (0,n) 一次的方案数。

重点是恰好的限制,考虑容斥。

fi 表示向上走 n 步,向左/右各走 i 步后第一次到达 (0,n) 的方案数,gi 表示向上走 n 步,向左/右各走 i 步后到达 (0,n) 的方案数。显然 gi=(n+2in,i,i)

答案即为 (2nn)mi=0fifmi

Sol1(官方题解)

考虑用 gi 减去不合法方案得到 fi。枚举上一次经过 (0,n) 是在 gj,要求这 2(ij) 步都不能经过 (0,n),也就是卡特兰数 Cij1

fi=gii1j=0gjCij1

可以卷积处理,时间复杂度 O(nlogn)

Sol2

经典套路,再设 hi 表示从 (0,n) 向左/右各走 i 步回到 (0,n) 的方案数,有 hi=(2ii)H(x)=(14x)1/2(见 (搜索 取一半组合数))。

显然 G=FH,于是:

F2=G2H2=(14x)G2

由于只算第 m 项,可以直接拆开计算。

时间复杂度 O(n)

Sol3(搜索 ARC124F)

ABC245Ex Product Modulo 2 (3000)

M 分解质因数 M=pe11pe22,显然每种质因数独立,故只需对 m=pen=Nmodpe 求原问题答案,再乘起来即可。

n=xpd(px)

先考虑 x0 的情况。钦定序列中恰好有 dp,这里的方案数为 (k+d1d)。在该条件下,得到的 n 的集合为 S={spd(s,ped)=1},又由欧拉定理 aφ(p)a(modp)((a,p)=1),得到每个 n 的概率都是一样的,算出总方案再除掉 |S| 即可。

ci 表示 Aip 的次数,则 p 以外的数的选择方案数为:

ki=1peci1(p1)=pkekd(p1)k

故得到 n=xpd 的方案数为:

(k+d1d)pkekd(p1)kped1(p1)=(k+d1d)p(k1)(e1)(p1)k1

对于 x=0 的情况,说明 p 的次数大于等于 k。考虑容斥,用全部方案数减去不合法方案数,即:

peke1d=0(k+d1d)pkekd(p1)k

瓶颈在于分解质因数,此处时间复杂度 O(m)

ARC126E Infinite Operations (2800)

不知道为什么发现答案即为 f(A1,A2,,An)=121i<jn|AiAj|,可以简单对方差归纳证明:

  • 不妨设 A1<A2<<An。若 A1=An 则答案为 0,显然成立。否则选择 t[1,n) 使得 At<At+1

  • AtAt+1 变为 (At+At+1)/2,方差严格变小。由归纳假设这样构造得到的贡献为(f 只是记号,简写式子):

f(A1,,At+At+12,At+At+12,,An)+At+1At2=f(A1,A2,,An)

(即合并 tt+1tt+1 以外的点没有影响,只少了 (At+1At)/2 的贡献)

于是用动态开点线段树维护即可。

时间复杂度 O((n+q)logAi)

ARC126F Affine Sort (3500)

考虑 ck 的限制有点奇怪,记 g(k) 表示 c=k 时的合法 (a,b,c) 对数,则 f(k)=ki=1g(i)

可以证明 g(k)k2k+ 时存在极限,设其为 c。则 g(k)ck2f(k)13ck3,有 limk+f(k)k3=13c

问题简化为了求 limk+g(k)k2。限制要求 (aXi+b)modk 单增,不妨转化为 (aXi+b)modkk 单增。而当 k 足够大时该问题近似是连续的,故可以直接视其为 {aXi+bk}={αXi+β}。需要对满足条件的 (α,β)(α,β[0,1)) 求二元积分。

为方便设 X0=Xn。先不考虑 β,假设对于某一 α,将 {αXi} 画在一个长为 1 的圆周(每个点代表 [0,1) 的数,顺时针增大)上,则必要条件是画出的点依次顺时针排列(即 Pi 的前驱为 Pi1,后继为 Pi+1)。

换句话说,设 f(α)=ni=1{α(XiXi1)},则 α 合法的充要条件为 f(α)=1(即从头到尾只能转一圈)。

再考虑对于一个合法的 αβ 需要满足 β+{αX1}1β+{αXn}<1,故其区间长度为 {α(X1Xn)}

具体而言,枚举每个 i{α(XiXi1)} 是一个分段函数,形如 {α(XiXi1)}=α(XiXi1)+dt(α[lt,rt]),而段数只有约 O(|XiXi1|) 个。

又所有斜率加起来为 ni=1(XiXi1)=0,故 f(α) 也是一个分段函数,且每一段都为常数,而段数为大约 S=ni=1|XiXi1|。枚举每一段,β 的合法区间长度形如一次函数,对 β 积分即可。

时间复杂度 O(SlogS)

ARC128F Game against Robot (3800)

不看题解做出银牌题,可喜可贺

下面设 n=N/2

先考虑如何判断给定排列 p 的答案。显然直接贪心吃最大是错的,因为 B 的策略是固定(而不是最优)的,A 选较小值可能可以使 B 选较小值从而增大 A 的收益。

a 中的数按 p 排列成一排,则 B 会优先烧最靠前的数。先不考虑每个数的权值,来考虑 A 最后能吃到哪些数。

  • 其中一个答案是:设 si 表示 前 i 个数中 Snuke 吃掉的数量,则其合法当且仅当 i,siisi+1。然而这个性质难以计算答案。

  • 换一种想法,设 A 最后吃的数为 1b1<b2<<bn2n,则其合法的充要条件为 i,bi2i1。利用这个性质,从后往前维护优先队列,每次加入序列末尾两个数并删掉优先队列的最大数,操作 n 次后所有删掉的数的和即为答案。

由于是枚举所有排列,具有对称性,因此可以将整个序列翻转,改为从前往后维护优先队列。

考虑原问题。由上面过程可以看到 A 的策略与 ai 的具体值无关,只与大小关系有关。先将 a 从大到小排序,求出第 i 大数在所有情况中被选中的次数 fi,则答案即为 2ni=1aifi


恰好不好求,改为求 gm 表示前 m 大的数在所有情况中被选中的次数之和。将前 m 大的数染黑,那么对于一个排列 p 只需要考虑选了多少个黑数,下面对黑白序列计算,再乘上 m!(2nm)! 即可。

设第 t 次向优先队列中加的黑数数量为 ct[0,2]2nt=1ct=m。设 x 为优先队列的大小,则每次 xmax(0,x+ct1)

dt=ct1,看作在网格图上移动:从 (0,0) 出发,每次向右走一步,向上走 dt 步,若跨越 x 轴就强行贴着 x 轴走(图中的红边)。

则红边对应着删去白数,数出所有情况中红边的总数,容斥即可得到删去黑数的总数。

强行不跨越 x 轴的操作看起来很奇怪,若允许跨越 x 轴,则最后会走到 (n,mn)

发现红边即对应走到前缀最小值处。而每次前缀最小值只会减少 1,故红边的数量是最低点纵坐标的相反数


引理:从 (0,0) 走到 (n,m),每次可以向右上/右/右下走,方案数分别为 1,2,1。则路径方案数总数为 (2nn+m)

证明:

ANS=[xm](x+2+x1)n=[xm]xn(x2+2x+1)n=[xm+n](x+1)2n=(2nn+m)

pm,k,qm,k(k[n,min(0,mn)]) 分别表示最小值 等于大于等于 k 的路径方案数总数。用类似卡特兰数的套路,有:

qm,k=(2nmn+n)(2n2(k1)m+n+n)=(2nm)(2nm2k+2)

pm,k=qm,k+1qm,k=(2nm2k)(2nm2k+2)

lim=min(0,nm),lim=max(0,mn),有:

gmm!(2nm)!=limk=n(n+k)[(2nm2k)(2nm2k+2)]=nlimk=n[(2nm2k)(2nm2k+2)]+limk=nk[(2nm2k)(2nm2k+2)]=n(2nm+2lim)nk=limk[(2nm+2k)(2nm+2k+2)]=n(2nm+2lim)k=limk(2nm+2k)+k=limk(2nm+2k+2)=n(2nm+2lim)k=limk(2nm+2k)+k=lim+1(k1)(2nm+2k)=n(2nm+2lim)lim(2nm+2lim)nk=lim+1(2nm+2k)

预处理即可 O(1) 计算,该部分复杂度 O(n)

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

ARC115E LEQ and NEQ (2400)

对条件容斥,于是就变成了划分问题。

注意到一段的权值只与最小值有关,于是建出笛卡尔树类似 CDQ 分治 DP 即可。

使用差分及前缀和优化即可做到 O(n)

ARC112E Cigar Box (2700)

考虑操作对序列的影响是怎样的。显然最后的状态只与 每个数最后一次操作被放在哪一边有关,故对每个数考虑其最后一次操作,称其为关键操作

设共 L 个数最后被操作到左边,R 个数最后被操作到右边,显然这 L 个数必须是 a1,a2,,aL(并且它们对应关键操作的时间必须单增),这 R 个数必须是 anR+1,anR+2,,an(并且它们对应关键操作的时间必须单减),而中间 aL+1,aL+2,,anR 必须单调递增。

于是,倒序考虑每个操作,只需要确定以下信息,就可以唯一对应到一种操作序列:

  • 关键操作是哪些,它们的方向分别是哪里。
  • 对于每个非关键操作,其操作的是哪个数(该数必须已经被关键操作过了)。

考虑 DP,设 fi,L,R 表示确定了 i 个操作,其中有 L 个向左的关键操作,R 个向右的关键操作的方案数。

fi+1,L+1,Rfi,L,R,fi+1,L,R+1fi,L,R

fi+1,L,R2(L+R)fi,L,R

注意到系数只与 L+R 有关,即只关心总关键操作个数。故将状态改为总关键操作个数,设 fi,L,R=gi,L+R(L+RL),同样转移即可。

最后将对所有满足 al<al+1<<arfi,l1,nr 求和即可。

时间复杂度 O(nm)

ARC124E Pass to Next (3000)

设第 i 个人给出了 bi 个球,则传球后第 i 个人有 aibi+bi1 个球。

注意到传球后的状态与 bibi1 有关,若 minbi>0,将所有 bi 减去 1 后状态不变;另一方面,若 minbi=0,则其对应的状态是唯一的。故用总方案减去限制 i,bi>0 的方案数即为答案。

以总方案为例,所求即为:

{bi},biaini=1(bi1+aibi)

考虑拆括号。每个位置只会被覆盖 0/1/2 次,这取决于两端括号的选择。

用 DP 描述括号的选择。先断环为链,确定 (bn+a1b1) 的选择。设 fi,id 表示前 i 个括号(即统计到 (bi1+aibi)),第 i 个括号选择哪边(id=0 为左边 bi1,否则为右边 aibi),所有选择方案对应的和。其中若 id=0 则计算该括号的贡献,否则不计算

fi+1,0(aibi=0bi)fi,0

fi+1,1(aibi=01)aifi,0

fi+1,0(aibi=0bi(aibi))fi,1

fi+1,1(aibi=0(aibi))fi,1

统计与最初确定的 (bn+a1b1) 选择符合的状态求和即可得到答案。

总时间复杂度 O(n)

ARC131F ARC Stamp (3500)

考虑给定某个初状态如何判断合法。考虑倒推,每次将一个 ARC 变成 ???,表示该位可以任意填。

容易发现每次可以将 6 种子区间变成 ???:ARC,?RC,??C,AR?,A??,?R?。(A?C 不会在过程中出现)

将给出的 T 分解成 ARC,RC,C,AR,A,R,于是每次占领一定是占领某一段。

考虑 DP,可以设 fi,j,id 表示考虑前 i 段,最少操作次数为 j,是否选第 i 段的方案数。然而直接转移会算重,例如 [ARC][RC] 中,对于 S 为 ARCRC 及 ARCAA 两种情况,在考虑 [ARC] 时并不知道 [RC] 是否要占领,于是也不知道是否要统计步数。

fi,j,id 表示考虑前 i 段,最少操作次数为 j,第 i 段与第 i+1 段是否都占领的方案数。

在转移时,需要考虑该转移是否是必要的。

这里以 [ARC] 的转移为例:

  • fi,j,0fi1,j,0,不占领。

  • fi,j+1,127fi1,j,0,占领,且这步必要(前一步依赖)。

  • fi,j+1,027fi1,j,1,占领,且这步必要(后一步依赖)。

  • fi,j+1,127fi1,j,1,占领,且这步必要(前后一步依赖)。

  • fi,j+1,026fi1,j,0,只占领 i 而不占领前后,这步不必要。

注意上述转移在两个 [ARC] 间会算重(因为 [ARC] 不需要依赖前后),手动在 [ARC] 间加入间隔符 [X] 即可。

总时间复杂度 O(|T|k)

ARC138E Decreasing Subsequence (3600)

妙妙双射题?

考虑一张 n+1 个点的有向图,对所有 Ai>0 连边 (i,Ai1)

显然这张图只能由大连向小,由若干条链构成。长度为 k 的下降子序列对应着关键边 (R1,L1),,(Rk,Lk)(L1LkRkR1),且这些边都在不同的链里。

k 条关键边所在的链拎出来,并用每条关键边将其所在的链割成两半。设所有在 Li 一侧的点集为 A,所有在 Ri 一侧的点集为 B,显然 max{A}<min{B}

注意到:对于每个 max{A}<min{B}(A,B) 及将 AB 连成 k 条链的方案,有且仅有唯一的连关键边方式 (R1,L1),,(Rk,Lk) 使得 L1LkRkR1

于是只需要预处理 fi,j 表示将 i+1 个点连成 j 条链的方案数。枚举 |A|=x|B|=y,则选择 (A,B) 的方案数为 (n+1x+y),即可快速计算。

时间复杂度 O(n2)

ARC107D Number of Multisets (2100)

fi,j 表示用 i 个数凑出 j 的方案数。

考虑转移,要么去掉一个 1(如果当前状态有 1),要么全部乘 2(如果当前状态没有 1),即:

fi,j=fi1,j1+fi,2j

时间复杂度 O(n2)

ARC116D I Wanna Win The Game (1700)

fi 表示 n 个数和为 i,异或和为 0 的方案数。显然 i 必须为奇数。

考虑枚举所有数的最后一位有 j 个是 1

fi=2j,j[0,n](nj)f(ij)/2

时间复杂度 O(n2)

AGC022F Checkers (3600)

神仙题

  • O(n5)

由于 X 太大,可以把 Xk 视作基底,每个数看作 n 维空间内的点。

u,v 的一次操作认为是新建一个点 t 连向 uv,边权分别为 21,表示 t=2uv

最后根到某点的路径权积即为该点贡献。贡献一定形如 ±2k,下面计算每维贡献的可重集,最后乘上可重排即可。

考虑从根向下 DP。设 fi,x,y 表示共 i 个点,权值绝对值最大的点(设权为 ±2k,不关心 k 到底是多少)中有 x 个为正,y 个为负的方案数。

每次转移枚举 a 个权 2k 的点分裂,b 个权 2k 的点分裂。注意 ±2k 分裂后会产生 ±2k+12k,还可以继续分裂,故让它们完全分裂(之后不会再分裂)。

容易算出完全分裂后还剩下 xa+b2kyb+a2k,计入可重排里。故转移:

fi+a+b,a,b1(xa+b)!(yb+a)!fi,x,y

初始状态 f1,1,0=1Ans=n!fn,0,0

时间复杂度 O(n5),难以优化。但足以通过本题

  • O(n4)

上面的做法瓶颈在于需要记录最后一层的正负点个数。

考虑换一种建图方式,将 1 边缩起来。即对 u,v 操作直接将 u 连向 vuv 的父亲)。注意这里儿子有序。

此时一个点的贡献绝对值为 2dep,符号取决于其 儿子个数+祖先左侧儿子个数 的奇偶性。将每个点的符号与其父亲差分即为 其儿子个数+父亲右侧儿子个数+1

下面称有奇数个儿子的点为特殊的

仍然从上到下对每一层 DP,但由于符号与儿子个数相关需要改变状态。设 fi,j 表示共 i 个点,该层有 j 个特殊点 的方案数。

设下一层有 k 个点,若不考虑这些点中儿子个数对符号的影响,则每个父亲的儿子符号从右到左是 1,1,,1/1。故 1 共有 kj2 个,而 1k+j2

设考虑这些点中儿子个数的影响后共有 t 个点为 1。注意到若有两个特殊点权一正一负,可以令它们儿子个数变为偶数,不会影响权值。故令每一种方案唯一对应到 特殊点数量最少(即 |t(kj)/2| 个)的方案,不会算重。有转移:

fi+k,|t(kj)/2|1t!(kt)!fi,j

初始状态 f1,0=f1,1=1Ans=n!fn,0

时间复杂度 O(n4)

  • O(n3)

先将上述转移式改写一下,令 x=ty=kt,则:

fi+x+y,|(xyj)/2|1x!y!fi,j

注意到 (i+x,xj) 相同时转移只与 y 有关。故分步转移:

gi+x,xj1x!fi,j

fi+x+y,|(xyj)/2|1y!gi+x,xj

fA,|(By)/2|1y!gA,B

注意转移条件 x+ymax(1,j)2x+y+j

时间复杂度 O(n3)

ARC139D Priority Queue 2 (2800)

先把第 x 小改为第 n+1x+1 大(即删除后允许最大 nx+1 个数留下)。

暴力枚举值域,对每个 t[1,m] 计算最后 t 的数的期望个数,最后相加即为答案。

设最开始时 t 的数有 A 个,k 步中一共加入了 Bt 的数。则:

  • Anx+1,则每次操作后 t 的数始终不超过 nx+1 个,故最后 t 的数有 min(A+B,nx+1) 个。

  • A>nx+1,则每次操作后 t 的数至少有 nx+1 个,故最后 t 的数有 max(A+Bk,nx+1) 个。

暴力枚举 p,乘上方案数即可。

预处理组合数及幂次可做到 O(n+mk)

ARC139E Wazir (3200)

n,m 均为偶数时,显然最优方案为黑白间隔染色,方案数为 2

否则,可以选择交换 nm 使得其二之一成立:

  • n 为偶数,m 为奇数。

  • n,m 均为奇数且 nm

m 为奇数时,一行中最多能填 m12 个,且此时有且仅有两个相邻的空位。

设第 i 行的空位位置为 pi,注意到:

i 行与第 i+1 行满足要求当且仅当 pi+1=pi±1(modm)

于是可以说明最优方案的黑格数为 n2m12

  • n 为偶数时,令 {pi}={0,1,0,1,,0,1}

  • n 为奇数(nm)时,令 {pi}={0,1,0,1,,1,0,1,2,m2,m1}

考虑算方案数。先假设 p0=0,最后再乘上 m。即求:

x+y=n[mxy](nx)

n 较小时,暴力计算即可。

m 较小时,只需要计算:

(x+x1)n(modxm1)

使用多项式快速幂及多项式取模即可。

总时间复杂度 O(min(n,m)lognlogm)

ARC127E Priority Queue (2700)

n=Am=B

考虑判断终态 s1,s2,,snm 是否可行。考虑倒推,倒着考虑每个操作:

  • 若遇到 1 操作,则从优先队列中删除一个数。

  • 若遇到 2 操作,则将一个未被加入过的数加入优先队列,且要求该数比优先队列中所有数都大

若存在一种操作方式完成所有操作,则终态合法。

不难发现最优策略下 1 操作删除的数一定是最大的,而 2 操作加入的数会按照 snm+1,snm+2,,n,snm1+1,snm2+2, 的顺序加入。

那么预处理出 pi 表示删掉 snm+1i 时(即第一次 cnt1cnt2=i)进行的 2 操作的数量。则 si 合法当且仅当 i,nsnm+1ii+1pi(即 snm+1i 后面的空位数)。

即问题转化为:

0a1a2anmm 的数量使得 i,aipi

可以直接 O(n2) DP,也可参照 gym102978J Japanese Knowledge 用分治乘优化到 O(nlog2n)

真 · Japanese Knowledge

ABC249G Xor Cards (2800)

把卡片的 Ai 扔进线性基 P 里(线性基需记录对应的 Bi),插不进去的将 Bi 放到另一个线性基 Q 里表示可以随意用。

从高位向低位枚举 P 中元素。记录当前钦定选的 Ai 异或和 curBi 异或和 val。假设枚举到第 i 位(curi,Ki 分别表示 curK 在二进制下的第 i 位,Pi 表示 P 的第 i 位元素):

  • curi=0,Ki=0,则必须不选,跳过。

  • curi=0,Ki=1,若 Pi=0 则直接跳过;否则若钦定不选则 后面的位及 Q 可以任意选计入答案,若钦定选择则继续下一位。

  • curi=1,Ki=0,则必须选,若 Pi=0 则退出,否则跳过。

  • curi=1,Ki=1,若 Pi=0 则直接跳过;否则若钦定选则 后面的位及 Q 可以任意选计入答案,若钦定不选则继续下一位。

最后若 cur=K 可以在 Q 中任意选计入答案。

判断无解需要记录目前 是否已经钦定选数 及 线性基里是否有元素。

预处理线性基可做到 O(nlogW+log2W)

所以为什么官方题解和 User Editorial 都是三方的啊

ABC129Ex Dye Color (3500)

算停时,用 势函数和鞅的停时定理

对每种颜色的出现次数 ai 设势函数 φ(x)。设 pi,j 表示一次操作后某种颜色 X 出现次数由 i 变为 j 的概率,则我们希望:

1+ni=1ai+1j=0pai,jφ(j)=ni=1φ(ai)

φ(i)=i+1j=0pi,jφ(j)1n(i<n),φ(n)=0

考虑计算 pi,j。分两种情况:

  • 选的颜色中没有颜色 X,则概率为:

S1=nit=012n(iij)(nit)(n1(ij+t))(n(ij+t))=12n(ij)nit=0(nit)n(ij+t)n=12n(ij)[(ni+j)2ni(ni)2ni1]

  • 选的颜色中有颜色 X。则概率为:

S2=nit=012n(iij+1)(nit)ij+1+tn=12n(ij1)[(ij+1)2ni+(ni)2ni1]

于是 pi,j=S1+S2 可以 O(1) 算出。

由于是下海森堡矩阵,可以通过倒推 O(n2) 消元并解出 φ(x),计算答案。

总时间复杂度 O(n2)

ARC140F ABS Permutation (Count ver.) (3400)

先考虑 M=1 的情况。注意到满足条件的位置连起来会将整个数组划分成一条条链,等价于数链的条数,而链是好处理的。

假如钦定了每一条链的位置(未填数),方案数容易计算。难点在于要求两条不同的链不能相接

上容斥,设 fi 表示满足条件的位置恰好有 i 个,gi 表示钦定有 ni 条链(即有些满足条件的位置可能不被计入),有:

gk=i(ik)fi

fk=i(1)ik(ik)gi

该式直接差卷积即可。下面考虑如何算 gk

gk 的意义为:将长为 n 的数组划分为 kc1,,ck,其权值为:

k!2i[ci>1]

gk 即为所有划分方案的权值和。

可参照 CF1553I Stairs,使用分治乘(需要记录两端是否为 1),复杂度为 O(16nlog2n)。这里由于是上述题目中 ai 全为 1 的特殊情况,可以改为倍增 FFT,复杂度为 O(16nlogn)

接下来考虑 M>1。记 Q=P1 满足 QPi=i。则 |PiPi+1|=M 等价于 |QiQi+M|=1。又注意到位置可以随意互换,故这个模型等价于若干条互相独立的链。对每条链做 M=1 的倍增 NTT 再全部分治乘卷起来即可。

时间复杂度 O(16nlogn+nlog2n)

AGC057E RowCol/ColRow Sort (4100)

个人感觉这一场最有意思的题

考虑如何判断一个矩阵是否合法。

由排序网络的 0-1 原理,对于每个 k,将不超过 k 的数涂黑,得到 AkBk。若 Ak 按两种方式排序后都得到 Bk,则合法。

记矩阵 M 的每行黑格子数的可重集为 RM,每列黑格子数的可重集为 CM

引理:对于所有按行或按列排序后的 nm 列矩阵 Mf:RMCM 构成双射。
证明:不妨设 M 按行有序。将所有列按照黑格数量递减排序,显然 RMCM 不变,而此时 M 按列也有序,故 RMCM 唯一对应。

结论:矩阵 A 合法当且仅当 RA=RB,CA=CB
证明:将 A 按行排序后得到 A,有 RA=RA。由于 A 按列排序后得到 B,故 CA=CB。由引理,RA=RB,故 RA=RB。同理 CA=CB,可证得必要性,而充分性显然。

注意到颜色数很少,不妨按颜色分层。对于每个 k,只需要计算出在 Bk+1 中填出 Bk 的方案数,全部相乘即可得到答案。即,将 Bk+1 按行列排序后得到 Bk+1,在黑格中选一些格子,选出的格子组成矩阵的 M 满足 RM=RBk,CM=CBk

由于引理,M 由且仅由 Bk 交换一些行列得到。不妨设行交换的排列为 p1,,pn,列交换的排列为 q1,,qm。只需要满足:

Bki,j=1Bk+1pi,qj=1

ai 表示 Bki 行的黑格数,bi 表示 Bk+1j 列黑格数,则条件等价于:

jaipibqj

i[1,n],pibmax{q1,q2,,qai}

注意到 {ai}{bi} 均单调不增,考虑按 x=max{q1,q2,,qai} 从后向前 DP。

fi,j 表示 max{q1,q2,,qi}=j 的方案数,可以在转移时维护 {qi} 的方案数。再维护一个指针 t,容易在 at=i 时计算 {pi} 的方案数:

fi,j(ji+1)fi1,j+k<jfi1,k

fi,j(bjt+1)fi,j

最后由于 Rk,Ck 中重复的数会被计算多次但方案是相同的,所以要除掉可重排。注意 ai,bj=0 的要删掉,不然会算重。

前缀和优化可做到 O(nm+m2)。总时间复杂度 O(Bi,j(nm+m2))

ARC118E Avoid Permutations (3100)

从对每个 P 计算 f(P) 的角度来看十分不可做。由于可以从障碍中间穿过,只能用 DP 解决。

换一个角度,对每条路径统计放障碍的方案数。障碍不能碰到路径 的限制比较难办,考虑容斥,钦定一部分障碍必须放在路径上。

一边 DP 一边进行容斥。注意到最后需要根据钦定放障碍的数量来计算其它障碍的方案,并且两行间的交界处会出现两格子同列的情况。故设 fi,j,k,id1 表示在第 i 行走到第 j 列(下一步直接向下一行走),已经钦定放了 k 个障碍,障碍是否放在 (i,j) 的权值。转移需要枚举下一行走到哪,复杂度 O(n4)

在每一行转移内部用分步 DP 来优化。将状态改为 fi,j,k,id1,id2,表示在第 i 行走到第 j 列,已经钦定放了 k 个障碍,该行是否已放障碍,该列是否已放障碍的权值。转移只需考虑相邻的两个格子,复杂度 O(n3)

AGC053C Random Card Game (2900)

本文中认为每次操作拿走较大(而非较小)的牌,与原题等价。

容易发现被拿空的牌堆是确定的:1 号牌不可能被拿走。

设含有 1 号牌的牌堆为 A,另一牌堆为 B

B 中的每张牌 Bi 都会被 A 中的某张牌 Aj 删掉,且满足 Aj<Bi。设最小满足此条件的 jpi

显然下界为 n+max{pii},可以通过以下策略达到:

  • 若有 Ai<Bi 就对这样的 i 中最大的 i 删掉 Bi(故不会互相影响);否则就将 A1 删去(若 A1 不能删去则说明 A1<B1,矛盾)。

这样 B 中的每张卡能删就删,删去 A1 的次数就是 max{pii}

max{pii}k 的概率为 fk,则答案为 2nn1k=02fk(乘 2 是因为 A,B 可互换)。

即计算对所有 i[1,n],存在 j[1,min(i+k,n)] 使得 Aj<Bi 的概率。记该事件为 Ci,则:

fk=P(C1C2Cn)=P(C1)P(C2|C1)P(C3|C1C2)P(Cn|C1Cn1)

Ci|C1Ci1 不成立当且仅当 BiA1,,Amin(i+k,n),B1,,Bi 中最小的(若存在 BjBi,由于 Cj 成立 Ci 也一定成立)。故概率为 11i+min(i+k)

fk=nki=12i+k12i+kni=nk+1n+i1n+i

预处理后可以 O(1) 计算。总时间复杂度 O(n)

ARC133F Many Xor Optimization Problems (?)

q-analog 普及题

对于每个向量空间,求出其线性基并对主元位消元。

设主元位分别为 x1,x2,,xk,下面分成三部分计算:

  • 主元位 x1,x2,,xk 对应的向量空间数量。

  • 主元位为 x1,x2,,xk 的向量空间的最大子集异或和的期望值。

  • 主元位为 x1,x2,,xk 的基底数量。

第一个问题显然只与 k 有关。只需要数 k 维满秩的向量空间数量即可。

这是一个经典问题,考虑每个向量空间一定可以进行 n 次以下步骤之一来唯一得到:

  • 添加一个与已有向量线性有关的向量。假设当前秩为 t,则方案数为 2t

  • 添加一个与已有向量线性无关的向量,使秩增加 1(需要恰好被进行 k 次)。假设当前秩为 t,则方案数为 2k2t

写成生成函数即:

pk=k1i=0(2m2i)[xnk]ki=0112ix

前面数量容易计算,后面即 q-binomial 的形式,为 (nk)2,可以递推算出。该部分时间复杂度 O(m)

第二个问题,最大子集异或和就是所有基底的异或和。那么分每一位考虑,比 xk 高的位全都为 0,主元位必定为 1,非主元位有一半的概率为 1,故期望为:

2k+11+ki=12xi2

第三个问题,从低位到高位逐个确定每个基底。那么对于第 i 个基底,后面的 xi 个位置有 i1 个是主元位必须为 0,其它都可以任意选。故方案数为:

ki=12xi(i1)


全部组合起来,答案为:

0x1xkm1pk2k+11+ki=12xi2ki=12xi(i1)=mk=1pk2k(k1)/210x1xkm1(2k+11+ki=12xi)ki=12xi

那么只需要对每个 k 计算:

fk=0x1xkm1ki=12xi

gk=0x1xkm1(ki=12xi)ki=12xi

hk=0x1xkm1xkki=12xi

先考虑 gk,巧妙变形:

gk=0x1xkm1(ki=12xi)ki=12xi=0x1xkm1(2m1iX2xi)ki=12xi=(2m1)fk(k+1)0x1xk+1m1k+1i=12xi=(2m1)fkgk+1

于是只需快速计算 fkhk 即可。

fk 写出生成函数即:

F(x)=m1i=0(1+2ix)

还是 q-analog 那一套,代入 2x

(1+2mx)F(2x)=(1+x)F(x)

fi(2i1)=fi1(2m2i1)

线性递推即可。

hk 写出生成函数即:

H(x)=m1k=04kxk1i=0(1+2ix)

H(2x)=m1k=04k2xk1i=0(1+2i+1x)=24(1+x)m1k=04k+1xki=0(1+2ix)=12(1+x)mk=14kxk1i=0(1+2ix)=12(1+x)[m1k=04kxk1i=0(1+2ix)1+4mxm1i=0(1+2ix)]=12(1+x)[m1k=04kxH(x)1+4mxF(x)]

2(1+x)H(2x)=m1k=04kxH(x)1+4mxF(x)

(2i+11)hi=4mfi12ihi1[i=1],i1

同样可以线性递推。

总时间复杂度 O(m)

官方题解到处都是 NTT,错过了普及 q-analog 的大好机会

AGC041D Problem Scores (3100)

显然对于某个 k,只需要考虑前缀 k+1 个数 prek+1 之和大于后缀 k 个数 sufnk+1 之和的限制。

sk=prek+1sufnk+1,差分有 sksk1=akank+1。而 {ai} 单调不降,故 k=n12sk 是最小的,只需考虑此限制即可。

由于要求 {ai} 单调不降,设 {ai} 的差分数组为 {bi},考虑 bisk 的贡献:

  • n 为奇数:{1,0,1,2,,k+1 , k,k+1,,1}

  • n 为偶数:{1,0,1,2,,k+1 ,k, k,k+1,,1}

记此贡献系数为 ci。可以看到 b1 比较特殊,考虑枚举 b2,,bn 再算 b1 的取值方案数。限制即:

b1nni=2bi

b1>ni=2cibi

b1max(0,nni=2(ci+1)bi) 种取值方案。

对所有 (ci+1) 做完全背包即可,时间复杂度 O(n2)。可以同 P4389 付公主的背包 用分治乘优化到 O(nlog2n)

ARC111F Do you like query problems? (3100)

可以对每个位置分别考虑,可以线性得到贡献为关于 x=i(n+1i)q 次多项式,但无法避免插值(不过足以通过)。

更聪明的做法,首先对值域将期望拆成概率。枚举 w[0,m),将所有 w 的数视为 1,其它数视为 0,计算答案后全部求和即可得到原问题答案。

将修改和询问分别考虑。考虑计算 t 次操作后第 i 个数为 1 的概率 fw,t,i。注意到只有两种修改会影响 ai 的取值,称作关键操作

  • 第一类操作,i[l,r],v<w

  • 第二类操作,i[l,r],vw

于是 ai 由最后一次关键操作决定。而一次操作为关键操作的概率为:

pi=i(ni+1)n(n+1)/22m2m+112(wm+mwm)=i(ni+1)n(n+1)/2m2m+1

若前 t 次操作中没有关键操作,则 ai0。否则有 mwm 的概率 ai1。故

fw,t,i=mwm[1(1pi)t]

先在这里对 w 求和,有:

gt,i=m1w=0fw,t,i=m12[1(1pi)t]

考虑上一次操作为第三种操作(即询问)的概率,答案即为:

Ans=q1t=0ni=1i(ni+1)n(n+1)/212m+1m12[1(1pi)t]=ni=1i(ni+1)n(n+1)m12m+1q1t=0[1(1pi)t]=ni=1i(ni+1)n(n+1)m12m+1(q1(1pi)qpi)

预处理即可做到 O(nlogq)

AGC003F Fraction of Fractal (3300)

设迭代了 k 次的图形为 Gk(初始图形为 G1)。

考虑 G2,显然应当关注上下/左右边界能否相接。

  • 若上下及左右边界均相接,则答案为 1

  • 若上下及左右边界均不相接,则每个小块都是一个联通块。设图 G1 中共 s 个黑格,则答案为 sk1

否则考虑左右相接而上下不相接的情况。设 G1 左右边界上有 p 个格子相接,那么 Gk 的左右边界上有 pk 个格子相接。

考虑迭代 k 次,相当于将 G1 的每个黑格替换为 Gk1。由于上下不相接,所以每一行是独立的。

那么一行中连续的 t 个黑格全部替换为 Gk1 后,得到的联通块数量即为 tfk1pk1

设所有行的连续段长度之和为 A,数量为 B,则有递推式:

f0=1,fk=Afk1Bpk1

当然可以直接写矩阵快速幂求出。

懒得写怎么办呢? Bonusk10105

写成生成函数就是 F(x)=AxF(x)Bx1x+1,即 F(x)=1(p+B)x(1px)(1Ax)

部分分式化后解得:

fk={Bpk+(ApB)AkAp,Ap(k+1)Akk(A+B)Ak1,A=p

时间复杂度 O(logk)

ARC142D Deterministic Placing (2900)

场上被 C 卡死了,这题要是时间充裕就搞出来了

首先注意到操作可逆,也即若在情况间连转移边,所有合法的情况一定形如若干二元环。

考虑合法情况 A,将每个棋子向移动到的点连边,显然会连出若干条链。这些链必须覆盖所有点,否则空点的邻居就可以改为移向空点,不合法。

注意到 A 的所有链尾都没有棋子,而其转移到的状态 B 的所有链头都没有棋子。而若某条链的链头 u 与另一条链的非链头 v 相邻,v 就可以在 A,B 状态之一中移向 u,不合法。

容易发现在这两个限制下一定是合法的。

于是一个情况合法的充要条件为:

  • 所有的链恰好覆盖了树上的所有点。

  • 每条链的链头的邻居都为某条链的链头,每条链的链尾的邻居都为某条链的链尾。

那么设计一个树形依赖背包 DP 即可。设 fu,0/1/2 分别表示 u 号点不是端点,当前连接了下面连上来的 0/1/2 条链的方案数。gu,0/1 分别表示 u 号点是端点,当前连接了下面连上来的 0/1 条链的方案数(gu,1 是实际方案数除二,这是为了在给 f 转移只有一种选择)。那么有转移:

gu,1gu,0fv,1+gu,1fv,1

gu,0gu,0gv,1

fu,2fu,2fv,2+2fu,1fv,1

fu,1fu,0fv,1+fu,1fv,2

fu,0fu,0fv,2

在 u 的转移结束后,还要转移 fu,1fu,1+gu,0

时间复杂度 O(n)

AGC040D Balance Beam (3500)

容易发现若 Ringo 的起始点为 x 时 Snuke 能够追上 Ringo,则起始点为 y(y<x) 时也能。故使 Snuke 获胜的起始点一定是一段前缀。

下面设 at,bt 分别表示点 t 所在的整段的 A 值与 B 值。

考虑起始点为 x,Snuke 在 y 处追上 Ringo。则需要满足:

x0atdt+yx(btat)dt0

显然 y 所在的整段 k 一定满足 Ak<Bk,故 y 也一定满足条件,故不妨设 y 为整点。

假设 x 只能为整点(即求答案向下取整的值),那么问题相当于在所有整段中选出两个不交的集合 S1,S2 满足 s=iS1Ai+iS2(BiAi)0,最大化 |S1|。可以设计这样一个算法:

  • 对于每个整段 k,先将其放入 S2 或者丢掉,再赋权值 ck 表示将其改为放入 S1 新增的代价(即让 s 减少多少)。

    • AkBk,则先将 k 选入 S2 中使 s 获得 BkAk 的值,ck=Bk
    • Ak>Bk,则先将其丢掉,ck=Ak
  • 将所有 ck 从小到大排序,若当前 sck 则选入并令 ssck,否则报告答案退出。

对于原问题,枚举选择一个整段 k 作为 x 所在的整段。设 p=xx={x},那么其对 s 的贡献为 pAk+(1p)(BkAk)

令初始 s=BkAk,对剩下的 n1 个整段进行上述算法,即可计算通过得到 p 以及答案。对所有 k 的答案取 max 即可。

预处理前缀和后可以二分优化算法的第二步,时间复杂度 O(nlogn)

注意分数比较时可能会爆 long long

ABC257Ex Dice Sum 2 (3500)

显然答案只与每个骰子六个面的和 Si 及平方和 Qi 有关(考虑指数型生成函数)。

考虑计算买了某 k 个骰子的期望收益,拆括号算(也可以用概率型生成函数)。下面的变量 i,j 都是在这 k 个骰子中枚举:

S=16k(i,p6k1A2i,p+2ij,p,q6k2Ai,pAj,q )iCi=16i,p6k1A2i,p+11812[(i,pAi,p)2i(pAi,p)2]=136(iSi)2+16iQi136iS2iiCi

Bi=6iQiiS2i36iCi,则 S=136[(iSi)2+iBi]

显然最难处理的就是这个平方项。考虑一个神奇的想法:将两个 (iSi) 中的一个换成变量 x,这样枚举 x 就只需要处理关于 x 的一次函数即可。(正确性见下方证明)

于是 36S=i(Six+Bi)。对于一个固定的 x,将 n 个骰子按这个值排序后取最大的 k 个统计答案即可(注意是按 36S=(iSi)2+iBi 统计,因为 x 不一定是 Si)。

那么只需要维护函数值间的大小关系即可。考虑令 x 从小到大扫描,任意两根直线间至多只有一个交点,这两个函数值的大小关系也只会变化一次。求出所有交点后维护所有函数值的大小关系,统计答案即可。

具体实现,可以维护一个有向完全图表示大小关系(u 连向 v 表示 u 大于 v),那么只需要统计入度 <k 的直线的函数值之和即可。注意交点的 x 坐标可能重复,意味着函数值可能相等。我们不在这种情况下统计答案(会算重),于是再对入度开一个桶判重即可。

时间复杂度 O(n2+sort(n2))


正确性证明(不保证正确):设最优解的 S,B 之和分别为 S1,B1。令 x=2S1,假设存在另一组解 S2,B2 满足:

S2x+B2>S1x+B1,S22+B2<S21+B1

2S212S1S2<B2B1<S21S22

(S1S2)2<0

显然矛盾。故一定会被枚举到最优解之一。

AGC031D A Sequence of Permutations (3100)

f(p,q)=r,则 rpi=qiri=qp1i,即 r=qp1

写出前几项看看(下面省略复合符号):

a1=pa2=qa3=qp1a4=qp1_q1a5=qp1q1_pq1a6=qp1q1p_pq1a7=qp1q1pp_p1qpq1a8=qp1q1pq_p1qpq1a9=qp1q1pqp1_p1qpq1

规律十分显然。设 V=qp1q1p,下面归纳证明:

  • i[1,4]a6k+i=VtaiVt,a6k+i+1=Vtai+1Vta6k+i+2=Vtai+1VtVta1iVt=Vtai+2Vt

  • a6k+5=Vta5Vt,a6k+6=Vta6Vta6k+7=Vta7Vt=Vt+1pVt1

  • a6k+6=Vta6Vt,a6k+7=Vta7Vta6k+8=Vta8Vt=Vt+1qVt1

于是只需要计算复合及 k 次复合即可。不需要快速幂,将置换拆成若干个循环,可以快速算出每个循环的答案。

时间复杂度 O(n)

所以为什么所有题解写的都是快速幂,也没多麻烦吧

ARC144D AND OR Equation (2500)

按每一位分别考虑。注意到对于第 t 位不为的二进制数 Sf(S)+f(2t)=f(S+2t)+f(0),即 f(S+2t)f(S)=f(2t)f(0)

wt=f(2t)f(0),可推知 f(S)=iSwi,同时容易验证该函数是合法的。

那么接下来只需要数 {f(0),w0,,wn1} 即可,需要满足 f(0)[0,k],f(0)+n1i=0|wi|k

写成生成函数即:

Ans=ki=0[xi]11x(1+2x+2x2+)n=[xk]1(1x)2(21x1)n=ni=02i(1)ni(k+i+1k)

时间复杂度 O(n)

ABC260Ex Colorfulness (3300)

看错题想了一晚上

k 次方之和看起来很不可做而且一看就是二合一,假装没有。下面对每个 k 计算 C(P)=k 的排列个数 sk

设第 i 种颜色有 mi 个球。

枚举颜色的所有排列,相当于让同种颜色的球不区分了。故对于一种颜色排列,其对应的原排列都有 imi! 种。

那么只需要对每个 k 数恰有 k 个连续段的颜色排列数量即可。

这是个经典问题,设 gk 表示钦定有 k 个相邻位置颜色相同,通过二项式反演即可得到答案。

对每种颜色 i,钦定有 ci 个相邻颜色相同。那么总方案数是:

(ncim1c1,,mncn)ni=1(mi1ci)

分治 NTT 卷一卷即可得到。该部分时间复杂度 O(nlog2n)

那对于二合一的后半部分,已经板到不能再板了,写成生成函数的形式,再交换和号,算一算分式求和即可做到 O(nlog2n+mlogm)

总时间复杂度 O(nlog2n+mlogm)

AGC024F Sequence Growing Hard (3000)

为了避免边界问题,在每个序列的末尾补一个 0

考虑怎样的插入是合法的。设插入的数为 x,其后面的数为 y,则:

  • x<y,则一定不合法。

  • x>y,则一定合法。

  • x=y,设 y 后第一个不与 y 相同的数为 k。若 y<k 则不合法,否则合法。

注意到第 3 种情况其实与在 k 前插入 x 是等价的,其恰能转化为第一或第二种情况之一。故只考虑前两种情况即可不重不漏。

那么现在问题变为每次在某个数 y 前插入 x(x>y)。于是若由 yx 连边(数间连边,非值间连边),那么最后会形成一棵大小为 n+1 的有根树。它满足:

  • 根的权值为 0,树的每个非根节点的权值大于其父亲权值。

  • 每个非叶节点的儿子有序。

那么只需要对树计数即可。设 fi,j 表示树根的值为 i,共有 j 个点的方案数;gi,j 表示 fi,j 关于 i 的后缀和。转移时用 fi,tgi+1,jt 拼在一起即可。

注意一棵树不一定只对应一个合法序列,实际上数的是其特殊拓扑序的数量,拓扑序要满足:

  • 每个点的拓扑序比其所有儿子拓扑序小。

  • 每个点靠右儿子的拓扑序比靠左儿子的拓扑序小。

计数时可以看做从右到左枚举每个儿子 v,先把 v 的子树中除了 v 的加入并与先前的可重排,再加入 v。于是实际转移式是:

fi,j[j=1]+j1t=1(j2t1)fi,tgi1,jt

时间复杂度 O(kn2)

hi,j=fi,j+1,则:

hi,j[j=0]+j1t=0(j1t)hi,tgi1,jt

那么可以用分治 NTT 做到 O(knlog2n)

(不保证正确)写出来大概是一个类似 H=HP+1 的东西,也许可以解微分方程做到 O(knlogn)

AGC004E Salvage Robots (3200)

这么多机器人一起动很麻烦,看作是出口带着墙壁一起动,墙壁撞到机器人就清除掉了。

考虑出口已经走过的地方。如果走过一步后走过的区域的横纵坐标最小最大值没有变,那么不会有机器人挂掉。

所以整个过程相当于维护一个矩形,每次向上下左右某个方向拓展一条边,并将这条边上还活着的机器人救下。

那么直接二维区间 DP 维护这个过程即可。时间复杂度 O(n2m2)

ABC258Ex Odd Steps (2800) | AGC013E Placing Squares (3500)

2017 *3500=2022 *2800

写一个不需要任何组合意义的暴力代数做法。

ABC258Ex Odd Steps

考虑只有 S 的限制的方案数。写成生成函数即:

F(x)=11x1x2=1x21x2x=1+x1xx2

熟悉斐波那契数的同学都知道,这就是斐波那契数的生成函数。

熟悉斐波那契数的同学都知道,斐波那契数的通项公式是:

fibn=15[(1+52)n(152)n]=15(AnBn)

对于限制,容斥钦定一个点集 S 必须经过。考虑设 fi 表示考虑前 i 个点,钦定经过第 i 个点的方案数,有:

fi=i1j=0fibaiajfj=15(Aaii1j=0AajfjBaii1j=0Bajfj)

前缀和优化即可。时间复杂度 O(nlogS)

不过 5 在模 998244353 下没有二次剩余,还需要拓域。


AGC013E Placing Squares

还是先考虑没有限制的情况。

先写出 F(x)=i=0i2xi 的封闭形式。由 k2=2(k+22)3(k+11)+(k0),可以得到:

F(x)=2(1x)33(1x)2+11x

于是答案的生成函数为:

G(x)=11F(x)=(1x)3x3+2x24x+1

化为线性递推形式即:

g0=0,g1=1,g2=5,gk=4gk12gk2+gk3

记矩阵 M 的第三行第一列值为 v(M)

故可以写成矩阵快速幂形式 gk=v(AkP)。同样的:

fi=v(i1j=0fjAxixjP)=v(Axi(i1j=0fjAxj)P)

A 是有逆矩阵的,前缀和优化即可。时间复杂度 O(mlogn)

ARC120F/F2 Wine Thief (3100/???)

Easy Version

Sol1(官方题解):

这个是怎么想到的

显然求出每个酒瓶被选中的次数 ansi 即可。

记序列上的总方案数为 pn,k=(nk+1k),环上总方案数为 qn,k=pn1,k+pn3,k1(枚举第一个酒瓶是否选)。

注意到如果问题在环上,那么每个位置的方案数都是相等的。棘手的地方在于所有酒瓶排成一个序列而不是环。

考虑先计算环的方案数,再将不满足环但满足序列的方案补上。可以设计这样一个算法:

  • 初始令 l=1,r=n。记 len=rl+1
  • ansl,ansl+1,,ansr 都加上 lennqlen,k。(环的方案数)
  • ansl,ansr 加上 flen4,k2。(同时选了 l,r,对 ansl,ansr 的贡献)
  • ll+2,rr2,kk2,重复进行。(同时选了 l,r,对 ansl+2,,ansr2 的贡献)

维护差分数组即可,时间复杂度 O(n)

注意当 l=r,k=1q1,1=0,但应该计入方案中,需要特判。

Sol2

这才是正确的做法

这里先假设 d 不一定等于 2。记序列上的总方案数为 pn,k=(n(d1)(k1)k)

考虑 DP。设 fn,k,i 表示在 n 个酒瓶中选 k 个,第 i 个被选中的次数。

i 个被选中,要求 idi1i+1i+d 均不能被选。但直接将两边删去会造成额外的限制。

考虑只删去 ii+d,再要求 idi1 不能选,这样限制是正确的。又由于 idi1 中至多只能选一个,可以得到:

fn,k,i=pnd,k1i1j=max(1,id)fnd,k1,j

那么当 d=2 时,就是:

fn,k,i=pn2,k1fn2,k1,i1=pn2,k1pn3,k2+fn3,k2,i2=

对于每个 i,前面的部分都是一样的,而最后的 fn,k,1=pn2,k1 容易计算。

时间复杂度 O(n)

Hard Version

书接上文,有:

fn,k,i=pnd,k1i1j=max(1,id)fnd,k1,j

我们只关心 fndt,kt 处的值。写出生成函数,记 Ft(x)=ndti=1fndt,kt,ixi。那么转移即:

Ft(x)=Ft+1(x)d1i=1xi+pnd(t+1),k(t+1)ndti=1xi

m=min(nd,k1),边界条件即 Fm(x)=ndmi=1xi

V(x)=d1i=1xiwt=pnd(t+1),k(t+1)Pt(x)=wtndti=1xi。于是:

Ft(x)=Ft+1(x)V(x)+Pt(x)=Ft+2(x)V2(x)+Pt+1(x)V(x)+Pt(x)==mi=tPi(x)V(x)it

只需要计算:

F0(x)=mi=0Pi(x)V(x)i

这可以分治 NTT 解决。

当然这和普通的分治 NTT 不太一样:

如图。圆圈表示 V,方框表示 P(内部是加号),右边为低位。注意一行中每一块是 d 次多项式。

先抛掉蓝色范围外的部分(最后加上即可)。记 Pl,r(x) 表示圆圈(不带 w)的乘积(即 Vrl+1),Ql,r(x) 表示 lr 行每行圆圈乘积(带 w)之和,Rl,r(x) 表示范围内的答案(钦定方框的最低位为 x0)。

Pl,r(x)=Pl,mid(x)Pmid+1,r(x)

Ql,r(x)=Pl,mid(x)Qmid+1,r(x)+Ql,mid(x)

Rl,r(x)=Pl,mid(x)Rmid+1,r(x)+Ql,mid(x)d(rmid)i=1xi+xrmid(Rl,mid(x)wmidPl,mid(x))

总时间复杂度 O(nlognlognd)

注意 k=1 时会导致 m=0,特判即可。

这 n 是怎么敢出到 1e6 的,如果被卡常了可以考虑特判掉 d=2

AGC015E Mr.Aoki Incubator (3600)

又看错题了,以为速度可以为负,又想了一晚上

下面称变成 Aoki 的 Takahashi 为被标记的

结论:设若初始标记集合 S,最终被标记的人集合为 f(S),那么 f(ST)=f(S)f(T)

证明:假设最终有一个人 xf(S)f(T),那么他不可能初始被标记,且标记他的人 x 同样满足 xf(S)f(T)……无限递归下去,而这个过程是有限的,故假设矛盾。

那么考虑只标记一个人 x,最终被标记的是哪些。

首先在 x 右边且比 x 慢的会被标记,在 x 左边且比 x 快的会被标记。

但不仅如此。在 x 左边且比 x 快的超过 x 后会将右边比它们慢的标记,同样在 x 右边且比 x 慢的会将左边比它们快的标记。容易发现新增的这些不会标记更多的人

将所有人按坐标排序,记速度的前缀最大值为 pmxx,后缀最小值为 smnx,那么被标记的人是:

  • x 本身。
  • x 左边,且比 smnx 严格快的人。
  • x 右边,且比 pmxx 严格慢的人。

dpi 表示考虑前 i 个人,初始标记了第 i 个人的方案数。

假设由 j 转移而来(上一个初始标记的是 j),那么覆盖不到的区域是位置在 (j,i) 的人且速度在 [pmxj,smni] 中的人。

由于 pmn,pmx 都是单调不降的,故对于一个 i 而言 j 具有可二分性。那么维护能转移的最小的 j,其具有单调性。

用 Two-pointer 维护即可,同时类似莫队维护检查的矩形。时间复杂度 O(sort(n))

AGC002F Leftmost Ball (3400)

考虑先枚举 0 色点的位置。那么计算方案时从右往左,每遇到一个 0 色点就在前面的数中抽 k1 个出来。

直接 DP 只能做到 O(n2k),没有前途。

换一个思路,不定顺序,而是全局一种一种颜色地加。为了避免算重,还要定一个加入颜色的顺序。

不妨将每种非 0 颜色的第一个位置拿出来并按位置排序,按照这个顺序加入。这样相当于每次加入新颜色都要求新加入的第一个位置前面都填 0

这样貌似已经可以做了,不过一个更巧妙的处理是将 0 色点与其它颜色分开处理。即每次加入是以下两种之一:

  • 将第一个未染色的位置变成 0
  • 将包含第一个位置的某 k1 个位置染成一种新颜色(要求染完后非 0 颜色数不能超过 0 个数)。

那么设 fi,j(ij) 表示已加入 i0j 种非 0 颜色。转移为:

fi,jfi1,j+(nj+1)(nki(j1)(k1)k2)fi,j1

时间复杂度 O(n(n+k))

注意 k=1 时比较特殊,要特判。

ARC145F Modulo Sum of Increasing Sequences (3900)

反演好题,单位根反演在模数较大时还是有用的

p=MOD

考虑处理不降的限制,可以计数差分数组。设 an+1=m,差分数组为 c1,c2,,cn+1。那么限制即 c1+c2++cn+1=m,而原数和 s=nc1+(n1)c2++cn

写成生成函数即求:

[xm]ni=011yix

其中 y 这一维是模 p 的循环卷积。

但这个形式还套个求逆,稍难处理。

可以从另一方面作些转化:令每个 aiai+i1(最后所有都需要减掉 i(i1)/2),则将不降改为单增,相当于在 0,1,,n+m1 中选出 n 个数的集合。下面令 mn+m,那么即求:

[xn]m1i=0(1+yix)

由于 p 很小,我们可以分开整块与零块两部分算。令 r=mmodpm=mr

枚举零块中选了 q 个数,整块中选了 n=nq 个数,那么分别计算:

F(y)=[xn][p1i=0(1+yix)]m/p

G(y)=[xq][r1i=0(1+yix)]


计算 F(y)。循环卷积相当于对每个 dsd=tfn,tp+d,可以用单位根反演。

ωp 次单位根,先对每个 d 求出 F(ωd)

d=1 时,大家都知道

p1i=0(1ωix)=1xp

这是因为左右都为 p 次多项式且最高项系数相同,且根集均为 1,ω,ω2,,ωp1。由因式定理即得左右多项式相同。

d1 时,记 g=gcd(d,p),那么会有:

p1i=0(1ωdix)=[p/g1i=0(1ωgix)]g=(1xp/g)g

[p1i=0(1+yix)]m/p=(1(x)p/g)gm/p

令人惊讶,这是一个整式。二项式展开后 xn 系数即为 [(p/g)n](1)n(1)n/(p/g)(gm/pn/(p/g))

F(ωd)=[(p/g)n](1)n(1)n/(p/g)(m/(p/g)n/(p/g))

然后需要用单位根反演还原系数:

sd=1pp1i=0ωidF(ωi)

Sol 1(标解)

先别着急拆。注意到 F(ωi) 只与 gcd(i,p) 有关,进行一个莫比乌斯反演:

sd=1pgpF(ωg)p1i=0[gcd(i,p)=g]ωid=1pgpF(ωg)p/g1i=0[gcd(i,p/g)=1]ωgid=1pgpF(ωg)p/g1i=0ωgidti,t(p/g)μ(t)=1ptpμ(t)g(p/t)F(ωg)p/g1i=0,tiωgid=1ptpμ(t)g(p/t)F(ωg)p/(gt)1i=0ωgtid=1ptpμ(t)g(p/t)F(ωg)pgt[pgtd]

一共要做 r 次,这里的总复杂度为 O(p2d2(p))

Sol 2(暴力)

不推式子,直接计算。当然 998244353 再强大也不可能有 500 次单位根,直接记录下来每个单位根的系数。设 si=p1t=0ci,tωt

但是系数 si 一定是整数,但结果可能是若干复数相加的形式。不过,对于某个 dp/d1t=1ωtd=1,而由 Sol 1 的式子可以知道这些复数一定可以拆成这样的和式相加的形式,接下来需要做的就是化简。

设数组 ei,t 使得 ci,k=tkei,t,则 si=ci,0p1t=1ei,t

莫比乌斯反演得 ei,k=tkμ(k/t)ci,t,于是:

p1k=1ei,k=p1k=1tkμ(k/t)ci,t=p1t=1ci,t(p1)/it=1μ(t)

可以在 O(p2) 内完成。

由于需要做 r 次,该部分总时间复杂度 O(p3)


计算 G(y)

直接预处理二元多项式乘积即可,该部分时间复杂度 O(p3)


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

AGC020F Arcs on a Circle (???)

为什么没人切啊

经典实数 DP。

不过这道题放的是线段而不是点,线段是跨整数的,故线段间小数部分的限制很复杂,不能直接记录。

可以先 O(n!) 枚举线段间小数部分的大小关系。

考虑断环为链。有一个很聪明的做法:以最长线段的左端点断开。这样不会有线段同时跨过该线段的左右端点,那么两边就独立了。

dpi,j,k,S 表示当前考虑到 [i,i+1),能覆盖最远的右端点在 [j,j+1),能覆盖最远的右端点是 k,已经放了集合 S 的线段。转移分步枚举添加的线段即可。

总时间复杂度 O(n!2nn2C2)

AGC021F Trinity (4100)

考虑 DP。从左到右依次加入每一列,设 fi,j 表示考虑前 i 列,共有 j 行已经填了黑格(不考虑空行与其的相对位置)的方案数。

考虑转移,在已经填了黑格的行再填对于 A 而言没有意义。设第 i 列新增了 k 个填了黑格的行,则:

  • k=0,则只能在之前的 j 行中填数,方案数即 1+j+j(j1)/2

  • k>0,分情况讨论:

    • 若最大最小值均在这 k 行之中,那么直接处理前面的 j 行与新增的 k 行的相对顺序即可。即在 j+k 行中选 k 行,那么方案数就是 (j+kk)

    • 若最大值或最小值在 k 行之中,可以看作在 j+k 行中选 k+1 行,并认为这 k+1 行最上面的一行在前面的 j 行中,下面则是新增的 k 行。那么方案数是 (j+kk+1)

    • 若最大最小值均不在这 k 行之中,同理方案数 (j+kk+2)

    • 该部分总转移系数是 (j+kk)+2(j+kk+1)+(j+kk+2)=(j+k+2k+2)

总转移式是:

fi,j=fi1,j(1+(j+12))+jt=1(j+2t+2)fi1,jt

答案为 nj=0(nj)fm,j

暴力实现复杂度 O(nm2),使用 NTT 优化可以做到 O(nmlogm)

事实上还有更好的方法。将转移写成指数型生成函数,可以得到:

fi,jj!=fi1,jj!+fi1,jj!j(j+1)2+(j+1)(j+2)jt=11(t+2)!fi1,jt(jt)!

Fi(x)=Fi1(x)+xFi1(x)+12x2Fi1(x)+[(ex1xx22)Fi1(x)]

经过一大堆无用的计算得到:

Fi(x)=exFi1(x)+(2exx2)Fi1(x)+(ex1x)Fi1(x)

那么设 Fi(x)=mj=0mk=0gi,j,kxjekx,可以 O(m3) 转移。

考虑如何计算答案,考虑 xiejx=txi(jx)tt! 对答案的贡献:

tjt(i+t)!t!(ni+t)=n!(ni)!tjt(nit)=(1+j)n1n!(ni)!

于是总复杂度 O(n+m3),而且不需要 NTT。

ARC137F Overlaps (3300)

先将所有端点离散化为 2n 个点,只对线段间相对关系计数,最后除掉 (2n)!/2n 即可。记左右端点分别为左右括号。

fi 表示第 i 个右括号前面的左括号数 (i1),有限制 1fik,fifi11,fn=1,方案数即 fi。问题变为对所有合法的 {fi} 计算方案数之和。

考虑对第二个条件容斥,即钦定一些 fifi12,这样的限制形成一些连续段。

设这样的长度为 i 的连续段方案数为 fi,记 F(x)=i(1)i1fixi,那么有 11S(x)=F(x)S(x)=11F(x)。可以 O(nlogn) 求出。

fi 可以用分治乘求出:记 Fl,r,id1,id2 表示值域在 [l,r]l 是否选择,r 是否选择的生成函数,直接分治乘即可。时间复杂度 O(klog2k)

注意 fn=1 的限制导致最后一段需要特殊处理重新求一遍。

总时间复杂度 O(nlogn+klog2k)

ARC118F Growth Rate (3600)

怎么会有人把银牌题出到 NOIP 模拟赛啊

fq,i 表示只考虑前 q 个数,Aq=x 的方案数,那么有:

Fq(x)=x1xFq1(aqx)

F0(x)=x1x,那么求 mi=0gi,其中:

G(x)=xni=1aini=111xnj=iaj

下面考虑求出 G(x)/xni=1ai

虽然 G(x) 的形式美观,但 m 的值域过大无法直接求解,还是考虑回原来的形式(复合与前缀和)。

考虑倒推,假设现在要求 S(B,m,k)=mi=0ikbi

  • B(x)=A(wx),则 S(B,m,k)=wkS(A,mw,k)

  • B(x)=11xA(x),则(Bt 为伯努利数):

S(B,m,k)=mi=0ikbi=mi=0ikij=0aj=mj=0ajmi=jik=(mi=jik)mj=0ajmj=0ajj1i=0ik=(mi=jik)mj=0ajmj=0aj1k+1kt=0(k+1t)Btjk+1t=(mi=jik)mj=0ajkt=01k+1(k+1t)Btmj=0ajjk+1t=(mi=jik)mj=0ajkt=01k+1(k+1t)BtS(A,m,k+1t)

上式的前后部分均可卷积优化至 O(klogk)

注意到每进行一次第二类操作,最大的 k 就无法维护。故只用维护 k=0,1,,n 即可。

总时间复杂度 O(n2logn)

*标解有可能更优的 O(nlog2nlogm+n2) 做法。

ABC272Ex Flipping Coins 2 (3700)

ABCEx 科技题

容易发现每个位置的硬币的情况都是一样的,下面考虑计算第 0 个硬币未被翻动的概率。这等价于下面这个问题:

[0,n) 的排列 p1,p2,,pn 的个数,使得恰有偶数个 i 满足 piai

事实上偶数这个目标根本没用,下面考虑对每个 k[0,n] 求出恰有 ki 满足 piai 的排列数量。

即求 Ferrers 棋盘 S=F(a1+1,a2+1,,an+1) 的所有 k命中数 hk。记 k 棋盘数为 rk,有:

rk(nk)!=ni=khi(ik)

hk=ni=k(1)ki(ik)ri(ni)!

而由下降幂棋盘多项式分解定理,有:

ni=0rnixi_=ni=1(x+aii+1)

采用分治下降幂卷积可以算出 ri,再二项式反演即可得到 hi

总时间复杂度 O(nlog2n)

参考资料: 《2020 年集训队论文 浅谈棋盘模型在计数问题中的应用》- 彭思进

AGC009E Eternal Average (3400)

设操作次数为 d=n+m1k1

把初始的 n+m 个数视为 n+m 个点,每次操作 k 个数就新建一个点作为这 k 个数对应的点的父亲。这样可以将操作对应为一棵 n+m+d 个节点的 k 叉树。

设每个点的权值为其儿子权值的平均值,则最后留下的数 s 即根节点的权值。

也即,设初始的 m1 所对应的编号为 x1,x2,,xm,则 s=mi=1kdepxi

注意到,设初始的 n0 所对应的编号为 y1,y2,,yn,则有:

mi=1kdepxi+ni=1kdepyi=1

考虑如何判定一个 s 是否可被构造出来:

结论:s 可被构造出来当且仅当存在 x1,x2,,xm 满足 mi=1kdepxi=s 且存在 y1,y2,,yn 满足 ni=1kdepyi=1s

证明:必要性显然。充分性:设 zt 表示为 txi,yi 个数,只需证可以构造一棵树使得深度为 i 的叶子节点恰有 zi 个。考虑这样一个算法:

  • d1 枚举 p,由于 pt=1ztkt=1,故 kzp。那么对这 zp 个点建立 zpk 个父亲节点,zp1zp1+zpk,zp0

即可得到一棵满足条件的树。证毕。

下面考虑计数。考虑将 s,1s 看作 k 进制小数,设 s=di=1aiki,1s=di=1biki,其中 ai,bi[0,k)。那么需要满足:

  • di=1ai=mt1(k1),t1N

  • di=1bi=nt2(k1),t2N

这是因为每一次进位都会使数位和减少 (k1)

,则 {bi} 即令所有 aik1ai,再令 adad+1 后进位获得的结果,设进位次数为 t3,则:

di=1bi=d(k1)+1di=1ait3(k1)

nt2(k1)=(n+m)m+t1(k1)t3(k1)

t2(k1)=(t3t1)(k1)

t20t3t1

故枚举 t1t3,统计答案。

A[0,k) 中的整数组成的和为 B 的数列数量为 S(A,B),可以用容斥计算:

S(A,B)=Ai=0(1)i(Ai)(Bik+A1A1)

答案为:

Ans=d1t3=0t3t1=0[S(dt3,mt1(k1))S(dt31,mt1(k1))]

直接暴力计算时间复杂度 O(d2mk)=O(m(n+m)2k3),无法通过。

注意到 A 不超过 d1B 不超过 m。枚举最后一个数是什么,用下式递推:

S(A,B)=k1i=0S(A1,Bi)

于是时间复杂度 O(dmk+dmk)=O(m(n+m)),可以通过。

(可能还有更优的做法?)

ABC279Ex Sum of Prod of Min (3300)

第一次用到五边形数定理

限制条件很多,但观察不出什么性质,不如直接硬上。

对第 t 个位置上填的数设出生成函数:

Ft(x)=i0min(t,i)xi=t(x1xxxt+11x)+xddx(xxt+11x)=txt+11x+x1(t+1)xt+txt+1(1x)2=xxt+1(1x)2

于是答案为:

Ans=[xm]nt=1xxt+1(1x)2=[xm]xn(1x)2nnt=1(1xt)=[xmn](1x)2nnt=1(1xt)

由于 mnn,故:

nt=1(1xt)t1(1xt)(modxmn+1)

由五边形数定理:

Ans=[xmn]i0(2n1+i2n1)k0(1)kxk(3k±1)/2=k0(1)k(2n1+mn(k(3k±1)/2)2n1)

模数较小,用卢卡斯定理计算组合数。注意到枚举的项数只有 O(n) 项,时间复杂度 O(mod+nlogmodn)

AGC035E Develop (3700)

给每个数建一个点,数 xx2x+K 连边。那么最后擦去的集合能为 S 当且仅当 S 的导出子图是 DAG。

K 为偶数时,奇偶数独立,且 S 合法当且仅当不包含没有奇/偶数中连续的 K/2+1 个数。那么设 dpi 表示考虑前 i 个数且第 i 个数不选的方案数,有:

dpi=i1j=iK/21dpj

可以优化到 O(n)

K 为奇数时,情况较为复杂。考虑将奇数与偶数列成两列,并令数 x 向数 (x+k) 连边。为方便,记奇数连向偶数的边为 A 型边,偶数连向奇数的边为 B 型边。

(图来自博客 AGC035E Develop - 淸梣ling

结论:若 S 的导出子图有环,则必存在一个环仅包含两条连接两侧的边。

证明:取环中最靠下的一条 A 型边 (u,v)。设 u 向下延申到 xv 向上延伸到 yx,y 分别与 x,y 通过 B 型边连接。

  • yx,则 (x,u,v,,x) 已经成环。

  • y>x,则如图所示。设 y 向上延申到 z。由前提假设,zu,那么 (y,u,v,y) 已经成环。

故证毕。

而所有这样的环长均为 K+2,于是 S 的导出子图无环当且仅当不存在一条从左侧延伸到右侧的长为 K+2 的链。

接下来考虑计数。设 dpi,j,k 表示从上到下考虑前 i 层节点,从第 i 层右侧点延申的链长为 j,从第 i 层左侧点延伸到右侧的链长为 k。转移:

  • 两侧都不选:两边的链都断掉。

fi1,j,kfi,0,0

  • 选左侧,不选右侧:右侧的链断掉,左侧(若有链)链长加一。

fi1,j,kfi,0,k+1(k>0)

fi1,j,0fi,0,0

  • 选右侧,不选左侧:右侧的链长加一,左侧的链断掉。

fi1,j,kfi,j+1,0

  • 两侧都选:右侧的链长加一,左侧的链在两种方案中取较大值。

fi1,j,kfi,j+1,max(k+1,j+2)

总时间复杂度 O(n2k)

ARC154F Dice Game (3600)

为什么省选前要做这个

提供一种不使用生成函数的暴力做法。

考虑扔 i 次已经扔出所有面的概率为 n!S2(i,n)ni,于是期望时间的 k 次方为:

sk=n!i0(S2(i,n)niS2(i1,n)ni1)ik

为了方便计算,取一个趋近于无穷大的整数 m,只计算和式中 im 的部分。

下面用 ϵ(m) 表示当 m 趋近于无穷大时值趋近于 0 的部分(于是在最终答案的计算中可以忽略)。结论:对于非负整数 k 与实数 a(0,1)limxxkax=0

sk(m)=n!mi=0(S2(i,n)niS2(i1,n)ni1)ik=n!mkS2(m,n)nmn!m1i=0S2(i,n)ni[(i+1)kik]

k1 次下降幂多项式 k1p=0cpxp_=(x+1)kxk。系数 cp 稍后再进行推导,下面继续计算上式:

sk(m)=n!mkS2(m,n)nmn!k1p=0cpm1i=0S2(i,n)niip_=mknmnt=0(1)t(nt)(nt)mk1p=0cpm1i=0ip_nt=0(1)t(nt)(nt)ini=mknt=0(1)t(nt)(ntn)mk1p=0cpnt=0(1)t(nt)m1i=0(ntn)iip_

第一个和式中,当 t0 时均趋近于 0,故其等于 mk+ϵ(m)

第二个和式中,考虑求 m1i=0(ntn)iip_

  • t=0 时,其等于 m1i=0ip_=1p+1mp+1_

  • t0 时,记 a=ntnf(x)=m1i=0aixi=1(ax)m1ax,所求即:

f(p)(1)=p!ap(1ax)p+1+ϵ(m)=p!nt(ntt)p+ϵ(m)

于是带入得:

sk(m)=mk+ϵ(m)k1p=0cp1p+1mp+1_k1p=0cpnt=1(1)t(nt)[p!nt(ntt)p+ϵ(m)]

接下来先推导 ct

k1p=0(kp)xp=k1p=0(kp)pt=0S2(p,t)xt_=k1t=0xt_k1p=t(kp)S2(p,t)

cp=k1t=p(kt)S2(t,p)=kt=p(kt)S2(t,p)S2(k,t)=S2(k+1,t+1)S2(k,t)=(t+1)S2(k,t+1)

sk(m)=mk+ϵ(m)k1p=0S2(k,p+1)mp+1_k1p=0(p+1)S2(k,p+1)nt=1(1)t(nt)[p!nt(ntt)p+ϵ(m)]

可以发现关于 m 的部分全部消掉了。

sk=k1p=0(p+1)!S2(k,p+1)nt=1(1)t(nt)nt(ntt)p

sk=kp=1p!S2(k,p)nt=1(1)t+1(nt)nt(ntt)p1

可以分两步计算:

  • fp=nt=1(1)t+1(nt)nt(ntt)p1

  • sk=kp=1p!S2(k,p)fp

第一步即计算数列 k 次幂和,使用分治乘做到 O(nlog2n+mlogm)。具体做法可见 P4705 玩游戏.

第二步,将第二类斯特林数拆开:

sk=kp=1fppt=0(1)t(pt)(pt)k=kp=1fppt=0(1)pt(pt)tk=mp=1(1)pfpmt=0(1)t(pt)tk=mt=0(1)ttkmp=1(1)p(pt)fp

同样分两步计算:

  • gt=mp=1(1)p(pt)fp

  • sk=mt=0(1)ttkgt

第一步可以直接 NTT 计算,复杂度 O(mlogm)

第二步同样是计算数列 k 次幂和,复杂度 O(mlog2m)

综上,总时间复杂度 O(nlog2n+mlog2m)

本文作者:苹果蓝17

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

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

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