Atcoder 计数乱做
ARC132E Paw (3100)
记覆盖为左为 <-
,覆盖为右为 ->
,不覆盖为 =
。则最后一定变成 <<<...===...>>>
,且等号两侧是两个相邻的洞。
考虑对每两个相邻的洞算最后形成这种情况的概率。设左边有 LL 个洞,右边有 R 个洞。
显然左右是独立的,只考虑右边。那么只要求每次选择时,如果选到最左的,不能向左走。即有:
概率即为 FlFr。
时间复杂度 O(n)。
ARC132F Takahashi The Strongest (3000)
发现 T 能赢 A 和 S 当且仅当 A 和 S 出一样的,而 T 比他们俩都大。
考虑把给出的策略扔进四元幂级数里,然后做以下运算的卷积:
由 FWT 理论,构造变换矩阵:
太好看了,所以随便求出逆矩阵:
求出卷积 F 后翻转一下,现在只需要对每一个集合求 F 中与它至少有一位相同的集合数量。
容斥一下,变成每一位都不同,可以再 FWT。
总时间复杂度 O(k4k)。
ABC225H Social Distance 2 (3000)
先考虑 K=0,并且要对三种情况分别算 S1(n,m),S2(n,m),S3(n,m),分别是:
- 两旁都坐人
- 左边坐人,右边无人
- 两旁都无人
用一些简单的生成函数可以推导出分别是 (n+k−12k+1),(n+k−12k),(n+k−12k−1)。
最后分治 FFT 卷到一起即可。
时间复杂度 O(nlog2n)。
ARC101F Robots and Exits (2900)
经过 114514 分钟思考后,记 Li 与 Ri 分别为第 i 个机器人到最近左右出口的距离。
注意到方案仅在于每个机器人是从左还是右出口离开。并且如果机器人不消失的话,向左和向右是相对独立的。也就是过程一定是向左走一段,再向右走一段……
按 Li 排序,再设单调不降的数组 Pi,那么过程可以看作向左走 L1,再向右走 P1,再向左走 L2,再向右走 P2……
最后若 Pi≥Ri,那么机器人 i 就从左出口离开;否则从右出口离开。
现在问题被简化了许多,考虑对 Ri DP。设 dpi 表示 Pi=Ri 且 Pi−1<Ri 的方案数。
注意 dp0=1。
然而这样不太正确,原因在于某些机器人的 L 相同,它们的 P 也必须相同,这样后面就会算重(因为只需加一次)。
解决办法很简单,如果 Li=Li−1 的话,就做个差分即可。
二维偏序用树状数组优化,时间复杂度 O(nlogn)。
AGC032F One Third (4000)
考虑转化问题。认为操作是在圆周上画红点,并且每画一个红点就在顺时针 120∘ 位置画一个绿点,在逆时针 120∘ 位置画一个蓝点。
于是问题变为了两个异色点间最短距离期望。
按第一次画点断环为链,问题变为:
一根长度为 [0,13] 的线段的左端点为红点,右端点为蓝点。随机位置随机颜色画 n−1 个点,求两个异色点最短距离期望。
显然最短的异色点对一定是相邻的,考虑枚举相邻异色点对数 k,再计算概率和条件期望相加即可。
-
概率:只考虑同色连续段,这样相邻两个点一定异色。设以 R 开头,B 结尾的方案数为 fn,以 R 结尾的方案数为 gn,则 fn=fn−1+gn−1,gn=2fn−1。最后再插板乘上 (nk) 即可。
-
条件期望:异色点对连成的线段总长度期望为 k3n,由随机变量相关理论可知最短期望为 1k2×k3n=13nk。
时间复杂度 O(n)。
ABC236Ex Distinct Multiples (2900)
显然唯一难搞的就是 “互不相同” 条件,直接考虑容斥。
也许会考虑钦定一些点填的数必须相同,但这样需要记录若干组点集,难以实现。
不妨考虑钦定边集(两个点填的数相同即连边)。设 fS 表示恰好连 S 边的方案数,gS 表示钦定连 S 边的方案数。
显然 gS=∑T⊇SfT,由子集反演得 f∅=∑S(−1)|S|gS。
由于边集太大,我们无法直接枚举 S 计算。但 gS 只与连接 S 后分成的若干联通块的点集有关,可以考虑枚举点集。gS 即为若干联通块的方案数相乘,可以对每个联通块分别考虑,最后直接子集卷积 exp 即可。
现在枚举 n 个点的点集 V,考虑其中所有使 V 联通的边集 S 的权值(即 (−1)|S|)之和,设其为 Pn。
设 Qn,k 表示 n 个点的点集,k+1∼n 的每个点都要与 1∼k 中某个点联通的权值之和。
-
当 k>1 时,考虑 1 号点与 2 号点,它们间连边与不连边的权值正好相反,于是 Qn,k=0。
-
当 k=1 时,考虑 n 号点连出的边有 t 条,方案数为:
故 Pn=(−1)n−1(n−1)!。
总时间复杂度 O(n22n)。
AGC044 Random Pawn (3600)
设 fi 表示出生在 i 号点,最优策略下的期望分数,显然有转移式:
然而我们并不知道转移顺序。仔细观察,不妨设 A1 为 Ai 中的最大值,由于所有 fi≤A1,可得f1=A1。可以以此断环为链(新开与 1 号点相同的 n+1 号点)。
然而剩下的仍不知道转移顺序。但是观察发现如果 Bi=0,事实上只需要求出所有 (i,Ai) 构成的上凸壳,即可算出答案。
尝试做一些转换使原问题变为 Bi=0。令 gi=fi−Ci,则:
我们希望对于所有 i∈[2,n],12(gi−1+gi)−Bi−Ci=0,即 Ci+1=2Bi+2Ci−Ci−1。
待定系数,设 C1=0,C2=k,依次递推出 Cn−1=pk+q 与 Cn=p′k+q′ 即可算出 k=2Bn−q+2q′p−2p′。
时间复杂度 O(n)。
ARC134F Flipping Coins (3500)
显然 i 只会影响 pi,因此把排列拆成若干循环,循环间互相独立。接下来考虑计算循环方案数的生成函数,最后 exp 即可得到答案。
对于每个循环,再分成若干条极长单调递增的链(有序),称每条链的链尾为“坏的”(即满足 pi<i 的点),则最后向上的硬币数量就是坏点被操作的次数。
设每条链的生成函数为 F(x)=∑iWimod2xi,然而大力卷会算重。
我们发现不满足限制(即不是极长的)的两条链可以组成一条更长的链,尝试容斥,然而链的长度带权,无法直接容斥。
考虑一种神奇的做法:我们不直接容斥,而是给每个长度赋一个新的权,其生成函数为 A(x),再使 A 以任意方式组合起来后恰好为正确的方案数:
而答案的生成函数为:
设 G(x)=1F(x),则 ˆS(x)=1ˆG(x)。
只需要多项式求逆甚至不需要卷积,时间复杂度 O(nlogn)。
一句话题解:多项式求逆
ARC133E Cyclic Medians (3300)
众所周知 E(X)=∑i≥0P(i>X)。设最后结果为 a,考虑枚举 k,算 a>k 的方案数。
记 >k 的数为 1,≤k 的数为 0。则若 xi=yj,则 a 会改变;否则不变。
考虑 a 在过程中是否改变(遇到 xi=yj 即认为改变)。
-
对于改变的情况,a 与 A 无关,故 k=p,a=id 及 k=V−p,a=1−id 的方案数是一样的(即对称),直接除 2 即可。用总方案数减去不变情况数即为改变情况数。
-
对于不变的情况,x 及 y 十分有限。设 g=gcd(x,y),则 a 会经过每一对 (x,y) 满足 x≡y(modg)。故 xi=xi+tg,yi=yi+tg 且 xi≠yi(否则一定会有 xi+tg=yi)。方案数即为 [kn/g(V−k)m/g+km/g(V−k)n/g]g。
总时间复杂度 O((n+m)logV)。
ARC133F Random Transition (???)
Sol1:
设题目给出的概率为 wa。
大力 DP,用矩阵快速幂优化,可以得到 O(n3logk) 的优秀做法。(特征多项式貌似求得出来,但是转移矩阵不会快速算 t 次幂,做不动)
问题模型看起来很自然,考虑转化一下。假设求由 a 到 b 的概率,问题等价于:
有 n 枚硬币,其中 a 枚硬币朝上。k 次操作,每次随机翻动一枚硬币,求最后有 b 枚硬币朝上的概率。
这样硬币间独立开了。考虑对每枚硬币写出二元生成函数,x 表示翻动次数,y 表示贡献。
设 P=ex(y+1),Q=e−x(y−1),则要求的概率即为:
把括号展开,并对所有 a 求和,设 ∑awa(P+Q)a(P−Q)n−a=n∑t=0ctPtQn−t,至于 ct 怎么求一会再说。
考虑 [xk]PtQn−t=(2t−n)kk!(y+1)t(y−1)n−t,故答案即为:
惊讶地发现答案的形式与 ct 的式子是一样的!直接分治乘即可(注意 t=0 要分开算)。
总时间复杂度 O(nlog2n)。
Sol1+:
注意到时间复杂度瓶颈在于计算:
对 W(x) 先复合 1+x,再复合 −21−x 即可。
时间复杂度 O(nlogn)。
ABC238Ex Removing People (3200)
首先可以考虑对每段位置统计次数,然而很难处理。
删除很难搞,时间倒流变成加人。加入一个人 u 时令他面向一个方向,则该方向的邻居 v 需要在原序列中面向 u。
考虑区间 DP,设 fl,r 与 gl,r 分别表示 l 位置和 r 位置已经放好人,放 l∼r 间人的方案数及距离和。
记 c1=[Sl=R]+[Sr=L],c2i=[Sl=R](i−l)+[Sr=L](r−i),则转移:
时间复杂度 O(n3)。
ARC135E Sequence of Multiples (3200)
看起来很不可做(单调递增且无规律),但发现 i∣Ai,不妨从商下手。
记 Bi=Aii,则有 Bi+1=⌊iBii+1⌋+1=Bi+1−⌈Bii+1⌉。
故有 Bi−Bi+1=⌈Bii+1⌉−1,当 Bi≤i+1 时值就不会再变了。
显然 {Bi} 单调不增。考虑其上界,由于 Ai≤X+2+3+⋯+i<X+i(i+1)2,故 Bi<Xi+i。
由均值不等式知 B2√X≤B√X<2√X,故有 O(√X) 的做法。
进一步优化,考虑按 Bi−Bi+1 分段。下面证明这样段数不超过 O(X1/3):
- 设 n=⌈X1/3⌉,则 n 前至多 n 段;又 Bn−Bn+1≤n,n 后至多 n 段。故总段数不超过 O(X1/3)。
具体实现,假设段首为 l,设 x=⌈Bii+1⌉,则对于 r 有 x=⌈Bl−(r−l)(x−1)r+1⌉,解得 r=⌊Bl+lx−x+12x−1⌋。
总时间复杂度 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 几乎一模一样很相似,同样对每个格子设出其翻转偶数次及奇数次的指数型生成函数:
对于确定的初末状态(指每个格子都已确定),直接将所有对应的生成函数卷起来即可。
然而我们现在只有初始状态,末状态可能有很多种(因为只给定了每行黑格的个数而不是具体方案)。直接对每一行 DP 求出每个指数对应的方案数,再把每一行暴力卷起来得到最终每个指数对应的方案数。(DP 复杂度为 O(nm3),卷起来复杂度为 O(n2m2))
处理完后,只需要把 nm∑i=−nmciˆPi/nmˆQ1−i/nm 展开即可。这里与 ARC133F 完全一样,直接背包 O(n2m2),分治乘可以优化到 O(nmlognm)。
最后需要计算答案。上面计算的是 ˆF(x) 的指数型生成函数,将所有 eax 改为 11−ax 即可转为普通幂级数。
考虑到 H′(x)=(F(x)G(x))′=F′(x)G(x)−F(x)G′(x)G(x)2,需要求出 F(1) 及 F′(1)。
然而 F(x) 中含有 11−x 项,直接将 x=1 带入 F′(x) 中会出问题。
将 F(x) 及 G(x) 同时乘上 (1−x)。则只有 (1−x)/(1−x) 项对 F(1) 有贡献,而 F′(1) 的贡献可以这样求:
总时间复杂度 O(n3m+n2m2)。
ABC241Ex Card Deck Score (2900)
大力写出生成函数:
m 特别大,但是 n 很小,分子可以暴力拆开,然而分母难以处理。
用部分分式分解,设 n∏i=111−Aix=n∑i=1ci11−Aix。解出后即可枚举每一项计算答案。
考虑如何计算 ci。暴力展开两边:
带入 x=A−1i,则有:
可以 O(n2) 解出。
总时间复杂度 O(n2+n2n)。
ABC231G Balls in Boxes (2600)
设操作后第 i 个球增加了 ci。则乘积为:
其中 pm 为任选 m 个 At 的乘积,可以用背包或者分治乘算出。
接下来只需要算 qm,即任选 m 个随机变量 ct 的乘积的期望。
不妨设这 m 个随机变量就是前 m 个随机变量(其余情况期望相同)。
Sol 1
设 ft,i 表示第 t 次是否选择第 i 个球,可以画出 k×n 的表。
等价于将前 m 个随机变量的和乘起来。将括号拆开,等价于选出有顺序的 m 行 j1,⋯,jn,并对 m∏t=1ft,jt 求和。
这个东西是容易的。因为若 jt 中有相同的数,则一定为 0(因为一次只能选一个数);其它情况下则为 1nm。
故 qm=km_nm。
Sol 2
设出 m 元生成函数,则答案即为 (∂m∂x1⋯∂xm(x1+x2+⋯+xm)k)(1,1,⋯,1)。
常数扔出来,设 G=(x1+x2+⋯+xm),考虑偏导:
故答案为 qm=km_nm。
总时间复杂度 O(n2) 或 O(nlog2n)。
ARC101F Robots and Exits (2900)
假设每个机器人在二维平面内,每一步操作是向上或向右上移动一步,转化为一张 DAG。路径不交,用 LGV 引理解决。
然而终点 y1,⋯,yk 没有确定而且无法枚举。考虑类似扫描线的 DP,一个个确定 yi,再计算下列行列式的和:
转移时需要枚举最后一列拆开,需要对所有 {x1,⋯,xk} 的子集求答案才能转移。故设状态为:
其中 si 为 S 中第 i 大的元素。
转移时,分 y|S| 是否为 t 转移:
边界情况为 fS,−∞=[S=∅]。
总时间复杂度 O(k2k(xk+n)。
ABC242Ex Random Painting (2800)
设一个状态为集合 S⊆{(li,ri)∣i∈[1,m]},称一个状态合法如果它覆盖了 [1,n]。原过程相当于不断转移状态,直到状态合法。
状态转移形成 DAG,用 ZJOI2020 抽卡 的套路,停时期望等于所有非法状态 出现的概率 乘上 离开该状态期望时间 的和。
大小为 k 的集合 走出该状态期望时间 为 mm−k。故只需对每个 k 求大小为 k 的合法状态数量 fk。
大力 DP,先将所有区间按字典序排序(先 l 后 r),设 fi,j,k 表示考虑前 i 个区间,覆盖了 [1,j] 的所有格子,大小为 k 的状态数量。
直接转移时间复杂度 O(nm2)。
注意到第三维 k 与给出的区间无关。设 F(x)=m∑i=0fixi,对于常数 C 可以通过同样的 DP 得到 F(C)。
n 较大时,需要用动态开点线段树记录第二维 j 优化转移,单次 DP 时间复杂度 O(mlogn)。
做 m+2 次 DP 得到 m+2 个点值,插值还原 {fi},时间复杂度 O(m2logn)。
ARC124F Chance Meeting (3200)
为了方便,设 n=H−1,m=W−1。
容易发现 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)m∑i=0fifm−i。
Sol1(官方题解):
考虑用 gi 减去不合法方案得到 fi。枚举上一次经过 (0,n) 是在 gj,要求这 2(i−j) 步都不能经过 (0,n),也就是卡特兰数 Ci−j−1。
可以卷积处理,时间复杂度 O(nlogn)。
Sol2:
经典套路,再设 hi 表示从 (0,n) 向左/右各走 i 步回到 (0,n) 的方案数,有 hi=(2ii),H(x)=(1−4x)−1/2(见 (搜索 取一半组合数))。
显然 G=FH,于是:
由于只算第 m 项,可以直接拆开计算。
时间复杂度 O(n)。
Sol3:(搜索 ARC124F)
ABC245Ex Product Modulo 2 (3000)
将 M 分解质因数 M=pe11pe22⋯,显然每种质因数独立,故只需对 m=pe,n=Nmodpe 求原问题答案,再乘起来即可。
设 n=xpd(p∤x)。
先考虑 x≠0 的情况。钦定序列中恰好有 d 个 p,这里的方案数为 (k+d−1d)。在该条件下,得到的 n 的集合为 S={spd∣(s,pe−d)=1},又由欧拉定理 aφ(p)≡a(modp)((a,p)=1),得到每个 n 的概率都是一样的,算出总方案再除掉 |S| 即可。
设 ci 表示 Ai 中 p 的次数,则 p 以外的数的选择方案数为:
故得到 n=xpd 的方案数为:
对于 x=0 的情况,说明 p 的次数大于等于 k。考虑容斥,用全部方案数减去不合法方案数,即:
瓶颈在于分解质因数,此处时间复杂度 O(√m)。
ARC126E Infinite Operations (2800)
不知道为什么发现答案即为 f(A1,A2,⋯,An)=12∑1≤i<j≤n|Ai−Aj|,可以简单对方差归纳证明:
-
不妨设 A1<A2<⋯<An。若 A1=An 则答案为 0,显然成立。否则选择 t∈[1,n) 使得 At<At+1。
-
将 At 与 At+1 变为 (At+At+1)/2,方差严格变小。由归纳假设这样构造得到的贡献为(f 只是记号,简写式子):
(即合并 t 和 t+1 对 t 与 t+1 以外的点没有影响,只少了 (At+1−At)/2 的贡献)
于是用动态开点线段树维护即可。
时间复杂度 O((n+q)logAi)。
ARC126F Affine Sort (3500)
考虑 c≤k 的限制有点奇怪,记 g(k) 表示 c=k 时的合法 (a,b,c) 对数,则 f(k)=k∑i=1g(i)。
可以证明 g(k)k2 当 k→+∞ 时存在极限,设其为 c。则 g(k)→ck2,f(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 的前驱为 Pi−1,后继为 Pi+1)。
换句话说,设 f(α)=n∑i=1{α(Xi−Xi−1)},则 α 合法的充要条件为 f(α)=1(即从头到尾只能转一圈)。
再考虑对于一个合法的 α,β 需要满足 β+{αX1}≥1,β+{αXn}<1,故其区间长度为 {α(X1−Xn)}。
具体而言,枚举每个 i,{α(Xi−Xi−1)} 是一个分段函数,形如 {α(Xi−Xi−1)}=α(Xi−Xi−1)+dt(α∈[lt,rt]),而段数只有约 O(|Xi−Xi−1|) 个。
又所有斜率加起来为 n∑i=1(Xi−Xi−1)=0,故 f(α) 也是一个分段函数,且每一段都为常数,而段数为大约 S=n∑i=1|Xi−Xi−1|。枚举每一段,β 的合法区间长度形如一次函数,对 β 积分即可。
时间复杂度 O(SlogS)。
ARC128F Game against Robot (3800)
不看题解做出银牌题,可喜可贺
下面设 n=N/2。
先考虑如何判断给定排列 p 的答案。显然直接贪心吃最大是错的,因为 B 的策略是固定(而不是最优)的,A 选较小值可能可以使 B 选较小值从而增大 A 的收益。
将 a 中的数按 p 排列成一排,则 B 会优先烧最靠前的数。先不考虑每个数的权值,来考虑 A 最后能吃到哪些数。
-
其中一个答案是:设 si 表示 前 i 个数中 Snuke 吃掉的数量,则其合法当且仅当 ∀i,si≤i−si+1。然而这个性质难以计算答案。
-
换一种想法,设 A 最后吃的数为 1≤b1<b2<⋯<bn≤2n,则其合法的充要条件为 ∀i,bi≥2i−1。利用这个性质,从后往前维护优先队列,每次加入序列末尾两个数并删掉优先队列的最大数,操作 n 次后所有删掉的数的和即为答案。
由于是枚举所有排列,具有对称性,因此可以将整个序列翻转,改为从前往后维护优先队列。
考虑原问题。由上面过程可以看到 A 的策略与 ai 的具体值无关,只与大小关系有关。先将 a 从大到小排序,求出第 i 大数在所有情况中被选中的次数 fi,则答案即为 2n∑i=1aifi。
恰好不好求,改为求 gm 表示前 m 大的数在所有情况中被选中的次数之和。将前 m 大的数染黑,那么对于一个排列 p 只需要考虑选了多少个黑数,下面对黑白序列计算,再乘上 m!(2n−m)! 即可。
设第 t 次向优先队列中加的黑数数量为 ct∈[0,2] 且 2n∑t=1ct=m。设 x 为优先队列的大小,则每次 x←max(0,x+ct−1)。
记 dt=ct−1,看作在网格图上移动:从 (0,0) 出发,每次向右走一步,向上走 dt 步,若跨越 x 轴就强行贴着 x 轴走(图中的红边)。
则红边对应着删去白数,数出所有情况中红边的总数,容斥即可得到删去黑数的总数。
强行不跨越 x 轴的操作看起来很奇怪,若允许跨越 x 轴,则最后会走到 (n,m−n):
发现红边即对应走到前缀最小值处。而每次前缀最小值只会减少 1,故红边的数量是最低点纵坐标的相反数。
引理:从 (0,0) 走到 (n,m),每次可以向右上/右/右下走,方案数分别为 1,2,1。则路径方案数总数为 (2nn+m)。
证明:
设 pm,k,qm,k(k∈[−n,min(0,m−n)]) 分别表示最小值 等于 及 大于等于 k 的路径方案数总数。用类似卡特兰数的套路,有:
设 −lim=min(0,n−m),lim=max(0,m−n),有:
预处理即可 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 个数必须是 an−R+1,an−R+2,⋯,an(并且它们对应关键操作的时间必须单减),而中间 aL+1,aL+2,⋯,an−R 必须单调递增。
于是,倒序考虑每个操作,只需要确定以下信息,就可以唯一对应到一种操作序列:
- 关键操作是哪些,它们的方向分别是哪里。
- 对于每个非关键操作,其操作的是哪个数(该数必须已经被关键操作过了)。
考虑 DP,设 fi,L,R 表示确定了 i 个操作,其中有 L 个向左的关键操作,R 个向右的关键操作的方案数。
注意到系数只与 L+R 有关,即只关心总关键操作个数。故将状态改为总关键操作个数,设 fi,L,R=gi,L+R(L+RL),同样转移即可。
最后将对所有满足 al<al+1<⋯<ar 的 fi,l−1,n−r 求和即可。
时间复杂度 O(nm)。
ARC124E Pass to Next (3000)
设第 i 个人给出了 bi 个球,则传球后第 i 个人有 ai−bi+bi−1 个球。
注意到传球后的状态与 bi−bi−1 有关,若 minbi>0,将所有 bi 减去 1 后状态不变;另一方面,若 minbi=0,则其对应的状态是唯一的。故用总方案减去限制 ∀i,bi>0 的方案数即为答案。
以总方案为例,所求即为:
考虑拆括号。每个位置只会被覆盖 0/1/2 次,这取决于两端括号的选择。
用 DP 描述括号的选择。先断环为链,确定 (bn+a1−b1) 的选择。设 fi,id 表示前 i 个括号(即统计到 (bi−1+ai−bi)),第 i 个括号选择哪边(id=0 为左边 bi−1,否则为右边 ai−bi),所有选择方案对应的和。其中若 id=0 则计算该括号的贡献,否则不计算。
统计与最初确定的 (bn+a1−b1) 选择符合的状态求和即可得到答案。
总时间复杂度 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,0←fi−1,j,0,不占领。
-
fi,j+1,1←27fi−1,j,0,占领,且这步必要(前一步依赖)。
-
fi,j+1,0←27fi−1,j,1,占领,且这步必要(后一步依赖)。
-
fi,j+1,1←27fi−1,j,1,占领,且这步必要(前后一步依赖)。
-
fi,j+1,0←26fi−1,j,0,只占领 i 而不占领前后,这步不必要。
注意上述转移在两个 [ARC] 间会算重(因为 [ARC] 不需要依赖前后),手动在 [ARC] 间加入间隔符 [X] 即可。
总时间复杂度 O(|T|k)。
ARC138E Decreasing Subsequence (3600)
妙妙双射题?
考虑一张 n+1 个点的有向图,对所有 Ai>0 连边 (i,Ai−1)。
显然这张图只能由大连向小,由若干条链构成。长度为 k 的下降子序列对应着关键边 (R1,L1),⋯,(Rk,Lk)(L1≤⋯≤Lk≤Rk≤⋯≤R1),且这些边都在不同的链里。
将 k 条关键边所在的链拎出来,并用每条关键边将其所在的链割成两半。设所有在 Li 一侧的点集为 A,所有在 Ri 一侧的点集为 B,显然 max{A}<min{B}。
注意到:对于每个 max{A}<min{B} 的 (A,B) 及将 A,B 各连成 k 条链的方案,有且仅有唯一的连关键边方式 (R1,L1),⋯,(Rk,Lk) 使得 L1≤⋯≤Lk≤Rk≤⋯≤R1。
于是只需要预处理 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),即:
时间复杂度 O(n2)。
ARC116D I Wanna Win The Game (1700)
设 fi 表示 n 个数和为 i,异或和为 0 的方案数。显然 i 必须为奇数。
考虑枚举所有数的最后一位有 j 个是 1:
时间复杂度 O(n2)。
AGC022F Checkers (3600)
神仙题
- O(n5)
由于 X 太大,可以把 Xk 视作基底,每个数看作 n 维空间内的点。
对 u,v 的一次操作认为是新建一个点 t 连向 u 及 v,边权分别为 2 及 −1,表示 t=2u−v。
最后根到某点的路径权积即为该点贡献。贡献一定形如 ±2k,下面计算每维贡献的可重集,最后乘上可重排即可。
考虑从根向下 DP。设 fi,x,y 表示共 i 个点,权值绝对值最大的点(设权为 ±2k,不关心 k 到底是多少)中有 x 个为正,y 个为负的方案数。
每次转移枚举 a 个权 2k 的点分裂,b 个权 −2k 的点分裂。注意 ±2k 分裂后会产生 ±2k+1 及 ∓2k,还可以继续分裂,故让它们完全分裂(之后不会再分裂)。
容易算出完全分裂后还剩下 x−a+b 个 2k 及 y−b+a 个 −2k,计入可重排里。故转移:
初始状态 f1,1,0=1,Ans=n!fn,0,0。
时间复杂度 O(n5),难以优化。但足以通过本题
- O(n4)
上面的做法瓶颈在于需要记录最后一层的正负点个数。
考虑换一种建图方式,将 −1 边缩起来。即对 u,v 操作直接将 u 连向 v(u 为 v 的父亲)。注意这里儿子有序。
此时一个点的贡献绝对值为 2dep,符号取决于其 儿子个数+祖先左侧儿子个数 的奇偶性。将每个点的符号与其父亲差分即为 其儿子个数+父亲右侧儿子个数+1。
下面称有奇数个儿子的点为特殊的。
仍然从上到下对每一层 DP,但由于符号与儿子个数相关需要改变状态。设 fi,j 表示共 i 个点,该层有 j 个特殊点 的方案数。
设下一层有 k 个点,若不考虑这些点中儿子个数对符号的影响,则每个父亲的儿子符号从右到左是 −1,1,⋯,−1/1。故 1 共有 k−j2 个,而 −1 有 k+j2。
设考虑这些点中儿子个数的影响后共有 t 个点为 1。注意到若有两个特殊点权一正一负,可以令它们儿子个数变为偶数,不会影响权值。故令每一种方案唯一对应到 特殊点数量最少(即 |t−(k−j)/2| 个)的方案,不会算重。有转移:
初始状态 f1,0=f1,1=1,Ans=n!fn,0。
时间复杂度 O(n4)。
- O(n3)
先将上述转移式改写一下,令 x=t,y=k−t,则:
注意到 (i+x,x−j) 相同时转移只与 y 有关。故分步转移:
注意转移条件 x+y≥max(1,j),2∣x+y+j。
时间复杂度 O(n3)。
ARC139D Priority Queue 2 (2800)
先把第 x 小改为第 n+1−x+1 大(即删除后允许最大 n−x+1 个数留下)。
暴力枚举值域,对每个 t∈[1,m] 计算最后 ≥t 的数的期望个数,最后相加即为答案。
设最开始时 ≥t 的数有 A 个,k 步中一共加入了 B 个 ≥t 的数。则:
-
若 A≤n−x+1,则每次操作后 ≥t 的数始终不超过 n−x+1 个,故最后 ≥t 的数有 min(A+B,n−x+1) 个。
-
若 A>n−x+1,则每次操作后 ≥t 的数至少有 n−x+1 个,故最后 ≥t 的数有 max(A+B−k,n−x+1) 个。
暴力枚举 p,乘上方案数即可。
预处理组合数及幂次可做到 O(n+mk)。
ARC139E Wazir (3200)
当 n,m 均为偶数时,显然最优方案为黑白间隔染色,方案数为 2。
否则,可以选择交换 n,m 使得其二之一成立:
-
n 为偶数,m 为奇数。
-
n,m 均为奇数且 n≥m。
当 m 为奇数时,一行中最多能填 m−12 个,且此时有且仅有两个相邻的空位。
设第 i 行的空位位置为 pi,注意到:
第 i 行与第 i+1 行满足要求当且仅当 pi+1=pi±1(modm)。
于是可以说明最优方案的黑格数为 ⌊n2⌋m−12:
-
当 n 为偶数时,令 {pi}={0,1,0,1,⋯,0,1}。
-
当 n 为奇数(n≥m)时,令 {pi}={0,1,0,1,⋯,1,0,1,2,⋯m−2,m−1}。
考虑算方案数。先假设 p0=0,最后再乘上 m。即求:
当 n 较小时,暴力计算即可。
当 m 较小时,只需要计算:
使用多项式快速幂及多项式取模即可。
总时间复杂度 O(min(n,m)lognlogm)。
ARC127E Priority Queue (2700)
记 n=A,m=B。
考虑判断终态 s1,s2,⋯,sn−m 是否可行。考虑倒推,倒着考虑每个操作:
-
若遇到 1 操作,则从优先队列中删除一个数。
-
若遇到 2 操作,则将一个未被加入过的数加入优先队列,且要求该数比优先队列中所有数都大。
若存在一种操作方式完成所有操作,则终态合法。
不难发现最优策略下 1 操作删除的数一定是最大的,而 2 操作加入的数会按照 sn−m+1,sn−m+2,⋯,n,sn−m−1+1,sn−m−2+2,⋯ 的顺序加入。
那么预处理出 pi 表示删掉 sn−m+1−i 时(即第一次 cnt1−cnt2=i)进行的 2 操作的数量。则 si 合法当且仅当 ∀i,n−sn−m+1−i−i+1≥pi(即 sn−m+1−i 后面的空位数)。
即问题转化为:
求 0≤a1≤a2≤⋯≤an−m≤m 的数量使得 ∀i,ai≥pi。
可以直接 O(n2) DP,也可参照 gym102978J Japanese Knowledge 用分治乘优化到 O(nlog2n)。
真 · Japanese Knowledge
ABC249G Xor Cards (2800)
把卡片的 Ai 扔进线性基 P 里(线性基需记录对应的 Bi),插不进去的将 Bi 放到另一个线性基 Q 里表示可以随意用。
从高位向低位枚举 P 中元素。记录当前钦定选的 Ai 异或和 cur 及 Bi 异或和 val。假设枚举到第 i 位(curi,Ki 分别表示 cur 及 K 在二进制下的第 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 的概率,则我们希望:
考虑计算 pi,j。分两种情况:
- 选的颜色中没有颜色 X,则概率为:
- 选的颜色中有颜色 X。则概率为:
于是 pi,j=S1+S2 可以 O(1) 算出。
由于是下海森堡矩阵,可以通过倒推 O(n2) 消元并解出 φ(x),计算答案。
总时间复杂度 O(n2)。
ARC140F ABS Permutation (Count ver.) (3400)
先考虑 M=1 的情况。注意到满足条件的位置连起来会将整个数组划分成一条条链,等价于数链的条数,而链是好处理的。
假如钦定了每一条链的位置(未填数),方案数容易计算。难点在于要求两条不同的链不能相接。
上容斥,设 fi 表示满足条件的位置恰好有 i 个,gi 表示钦定有 n−i 条链(即有些满足条件的位置可能不被计入),有:
该式直接差卷积即可。下面考虑如何算 gk。
gk 的意义为:将长为 n 的数组划分为 k 段 c1,⋯,ck,其权值为:
gk 即为所有划分方案的权值和。
可参照 CF1553I Stairs,使用分治乘(需要记录两端是否为 1),复杂度为 O(16nlog2n)。这里由于是上述题目中 ai 全为 1 的特殊情况,可以改为倍增 FFT,复杂度为 O(16nlogn)。
接下来考虑 M>1。记 Q=P−1 满足 QPi=i。则 |Pi−Pi+1|=M 等价于 |Qi−Qi+M|=1。又注意到位置可以随意互换,故这个模型等价于若干条互相独立的链。对每条链做 M=1 的倍增 NTT 再全部分治乘卷起来即可。
时间复杂度 O(16nlogn+nlog2n)。
AGC057E RowCol/ColRow Sort (4100)
个人感觉这一场最有意思的题
考虑如何判断一个矩阵是否合法。
由排序网络的 0-1 原理,对于每个 k,将不超过 k 的数涂黑,得到 Ak 及 Bk。若 Ak 按两种方式排序后都得到 Bk,则合法。
记矩阵 M 的每行黑格子数的可重集为 RM,每列黑格子数的可重集为 CM。
引理:对于所有按行或按列排序后的 n 行 m 列矩阵 M,f:RM→CM 构成双射。
证明:不妨设 M 按行有序。将所有列按照黑格数量递减排序,显然 RM 及 CM 不变,而此时 M 按列也有序,故 RM 与 CM 唯一对应。
结论:矩阵 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 按行列排序后得到 B′k+1,在黑格中选一些格子,选出的格子组成矩阵的 M 满足 RM=RBk,CM=CBk。
由于引理,M 由且仅由 Bk 交换一些行列得到。不妨设行交换的排列为 p1,⋯,pn,列交换的排列为 q1,⋯,qm。只需要满足:
设 ai 表示 Bk 第 i 行的黑格数,bi 表示 B′k+1 第 j 列黑格数,则条件等价于:
注意到 {ai} 及 {bi} 均单调不增,考虑按 x=max{q1,q2,⋯,qai} 从后向前 DP。
设 fi,j 表示 max{q1,q2,⋯,qi}=j 的方案数,可以在转移时维护 {qi} 的方案数。再维护一个指针 t,容易在 at=i 时计算 {pi} 的方案数:
最后由于 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。设最小满足此条件的 j 为 pi。
显然下界为 n+max{pi−i},可以通过以下策略达到:
- 若有 Ai<Bi 就对这样的 i 中最大的 i 删掉 Bi(故不会互相影响);否则就将 A1 删去(若 A1 不能删去则说明 A1<B1,矛盾)。
这样 B 中的每张卡能删就删,删去 A1 的次数就是 max{pi−i}。
设 max{pi−i}≤k 的概率为 fk,则答案为 2n−n−1∑k=02fk(乘 2 是因为 A,B 可互换)。
即计算对所有 i∈[1,n],存在 j∈[1,min(i+k,n)] 使得 Aj<Bi 的概率。记该事件为 Ci,则:
而 Ci|C1∩⋯∩Ci−1 不成立当且仅当 Bi 是 A1,⋯,Amin(i+k,n),B1,⋯,Bi 中最小的(若存在 Bj≤Bi,由于 Cj 成立 Ci 也一定成立)。故概率为 1−1i+min(i+k)。
预处理后可以 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,则方案数为 2k−2t。
写成生成函数即:
前面数量容易计算,后面即 q-binomial 的形式,为 (nk)2,可以递推算出。该部分时间复杂度 O(m)。
第二个问题,最大子集异或和就是所有基底的异或和。那么分每一位考虑,比 xk 高的位全都为 0,主元位必定为 1,非主元位有一半的概率为 1,故期望为:
第三个问题,从低位到高位逐个确定每个基底。那么对于第 i 个基底,后面的 xi 个位置有 i−1 个是主元位必须为 0,其它都可以任意选。故方案数为:
全部组合起来,答案为:
那么只需要对每个 k 计算:
先考虑 gk,巧妙变形:
于是只需快速计算 fk 及 hk 即可。
对 fk 写出生成函数即:
还是 q-analog 那一套,代入 2x:
线性递推即可。
对 hk 写出生成函数即:
同样可以线性递推。
总时间复杂度 O(m)。
官方题解到处都是 NTT,错过了普及 q-analog 的大好机会
AGC041D Problem Scores (3100)
显然对于某个 k,只需要考虑前缀 k+1 个数 prek+1 之和大于后缀 k 个数 sufn−k+1 之和的限制。
设 sk=prek+1−sufn−k+1,差分有 sk−sk−1=ak−an−k+1。而 {ai} 单调不降,故 k=⌊n−12⌋ 时 sk 是最小的,只需考虑此限制即可。
由于要求 {ai} 单调不降,设 {ai} 的差分数组为 {bi},考虑 bi 对 sk 的贡献:
-
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 的取值方案数。限制即:
故 b1 共 max(0,n−n∑i=2(ci+1)bi) 种取值方案。
对所有 (ci+1) 做完全背包即可,时间复杂度 O(n2)。可以同 P4389 付公主的背包 用分治乘优化到 O(nlog2n)。
ARC111F Do you like query problems? (3100)
可以对每个位置分别考虑,可以线性得到贡献为关于 x=i(n+1−i) 的 q 次多项式,但无法避免插值(不过足以通过)。
更聪明的做法,首先对值域将期望拆成概率。枚举 w∈[0,m),将所有 ≥w 的数视为 1,其它数视为 0,计算答案后全部求和即可得到原问题答案。
将修改和询问分别考虑。考虑计算 t 次操作后第 i 个数为 1 的概率 fw,t,i。注意到只有两种修改会影响 ai 的取值,称作关键操作:
-
第一类操作,i∈[l,r],v<w。
-
第二类操作,i∈[l,r],v≥w。
于是 ai 由最后一次关键操作决定。而一次操作为关键操作的概率为:
若前 t 次操作中没有关键操作,则 ai 为 0。否则有 m−wm 的概率 ai 为 1。故
先在这里对 w 求和,有:
考虑上一次操作为第三种操作(即询问)的概率,答案即为:
预处理即可做到 O(nlogq)。
AGC003F Fraction of Fractal (3300)
设迭代了 k 次的图形为 Gk(初始图形为 G1)。
考虑 G2,显然应当关注上下/左右边界能否相接。
-
若上下及左右边界均相接,则答案为 1。
-
若上下及左右边界均不相接,则每个小块都是一个联通块。设图 G1 中共 s 个黑格,则答案为 sk−1。
否则考虑左右相接而上下不相接的情况。设 G1 左右边界上有 p 个格子相接,那么 Gk 的左右边界上有 pk 个格子相接。
考虑迭代 k 次,相当于将 G1 的每个黑格替换为 Gk−1。由于上下不相接,所以每一行是独立的。
那么一行中连续的 t 个黑格全部替换为 Gk−1 后,得到的联通块数量即为 tfk−1−pk−1。
设所有行的连续段长度之和为 A,数量为 B,则有递推式:
当然可以直接写矩阵快速幂求出。
懒得写怎么办呢? Bonus:k≤10105。
写成生成函数就是 F(x)=AxF(x)−Bx1−x+1,即 F(x)=1−(p+B)x(1−px)(1−Ax)。
部分分式化后解得:
时间复杂度 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 转移只有一种选择)。那么有转移:
在 u 的转移结束后,还要转移 fu,1←fu,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。则需要满足:
显然 y 所在的整段 k 一定满足 Ak<Bk,故 ⌈y⌉ 也一定满足条件,故不妨设 y 为整点。
假设 x 只能为整点(即求答案向下取整的值),那么问题相当于在所有整段中选出两个不交的集合 S1,S2 满足 s=−∑i∈S1Ai+∑i∈S2(Bi−Ai)≥0,最大化 |S1|。可以设计这样一个算法:
-
对于每个整段 k,先将其放入 S2 或者丢掉,再赋权值 ck 表示将其改为放入 S1 新增的代价(即让 s 减少多少)。
- 若 Ak≤Bk,则先将 k 选入 S2 中使 s 获得 Bk−Ak 的值,ck=Bk。
- 若 Ak>Bk,则先将其丢掉,ck=Ak。
-
将所有 ck 从小到大排序,若当前 s≥ck 则选入并令 s←s−ck,否则报告答案退出。
对于原问题,枚举选择一个整段 k 作为 x 所在的整段。设 p=x−⌊x⌋={x},那么其对 s 的贡献为 −pAk+(1−p)(Bk−Ak)。
令初始 s=Bk−Ak,对剩下的 n−1 个整段进行上述算法,即可计算通过得到 p 以及答案。对所有 k 的答案取 max 即可。
预处理前缀和后可以二分优化算法的第二步,时间复杂度 O(nlogn)。
注意分数比较时可能会爆 long long。
ABC257Ex Dice Sum 2 (3500)
显然答案只与每个骰子六个面的和 Si 及平方和 Qi 有关(考虑指数型生成函数)。
考虑计算买了某 k 个骰子的期望收益,拆括号算(也可以用概率型生成函数)。下面的变量 i,j 都是在这 k 个骰子中枚举:
记 Bi=6∑iQi−∑iS2i−36∑iCi,则 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 满足:
显然矛盾。故一定会被枚举到最优解之一。
AGC031D A Sequence of Permutations (3100)
设 f(p,q)=r,则 rpi=qi,ri=qp−1i,即 r=q∘p−1。
写出前几项看看(下面省略复合符号):
规律十分显然。设 V=qp−1q−1p,下面归纳证明:
-
当 i∈[1,4],a6k+i=VtaiV−t,a6k+i+1=Vtai+1V−t⇒a6k+i+2=Vtai+1V−tVta−1iV−t=Vtai+2V−t。
-
a6k+5=Vta5V−t,a6k+6=Vta6V−t⇒a6k+7=Vta7V−t=Vt+1pV−t−1。
-
a6k+6=Vta6V−t,a6k+7=Vta7V−t⇒a6k+8=Vta8V−t=Vt+1qV−t−1。
于是只需要计算复合及 k 次复合即可。不需要快速幂,将置换拆成若干个循环,可以快速算出每个循环的答案。
时间复杂度 O(n)。
所以为什么所有题解写的都是快速幂,也没多麻烦吧
ARC144D AND OR Equation (2500)
按每一位分别考虑。注意到对于第 t 位不为的二进制数 S,f(S)+f(2t)=f(S+2t)+f(0),即 f(S+2t)−f(S)=f(2t)−f(0)。
记 wt=f(2t)−f(0),可推知 f(S)=∑i∈Swi,同时容易验证该函数是合法的。
那么接下来只需要数 {f(0),w0,⋯,wn−1} 即可,需要满足 f(0)∈[0,k],f(0)+n−1∑i=0|wi|≤k。
写成生成函数即:
时间复杂度 O(n)。
ABC260Ex Colorfulness (3300)
看错题想了一晚上
k 次方之和看起来很不可做而且一看就是二合一,假装没有。下面对每个 k 计算 C(P)=k 的排列个数 sk。
设第 i 种颜色有 mi 个球。
枚举颜色的所有排列,相当于让同种颜色的球不区分了。故对于一种颜色排列,其对应的原排列都有 ∏imi! 种。
那么只需要对每个 k 数恰有 k 个连续段的颜色排列数量即可。
这是个经典问题,设 gk 表示钦定有 k 个相邻位置颜色相同,通过二项式反演即可得到答案。
对每种颜色 i,钦定有 ci 个相邻颜色相同。那么总方案数是:
分治 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)。于是若由 y 向 x 连边(数间连边,非值间连边),那么最后会形成一棵大小为 n+1 的有根树。它满足:
-
根的权值为 0,树的每个非根节点的权值大于其父亲权值。
-
每个非叶节点的儿子有序。
那么只需要对树计数即可。设 fi,j 表示树根的值为 i,共有 j 个点的方案数;gi,j 表示 fi,j 关于 i 的后缀和。转移时用 fi,t 和 gi+1,j−t 拼在一起即可。
注意一棵树不一定只对应一个合法序列,实际上数的是其特殊拓扑序的数量,拓扑序要满足:
-
每个点的拓扑序比其所有儿子拓扑序小。
-
每个点靠右儿子的拓扑序比靠左儿子的拓扑序小。
计数时可以看做从右到左枚举每个儿子 v,先把 v 的子树中除了 v 的加入并与先前的可重排,再加入 v。于是实际转移式是:
时间复杂度 O(kn2)。
令 hi,j=fi,j+1,则:
那么可以用分治 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 的限制的方案数。写成生成函数即:
熟悉斐波那契数的同学都知道,这就是斐波那契数的生成函数。
熟悉斐波那契数的同学都知道,斐波那契数的通项公式是:
对于限制,容斥钦定一个点集 S 必须经过。考虑设 fi 表示考虑前 i 个点,钦定经过第 i 个点的方案数,有:
前缀和优化即可。时间复杂度 O(nlogS)。
不过 5 在模 998244353 下没有二次剩余,还需要拓域。
AGC013E Placing Squares
还是先考虑没有限制的情况。
先写出 F(x)=∑i=0i2xi 的封闭形式。由 k2=2(k+22)−3(k+11)+(k0),可以得到:
于是答案的生成函数为:
化为线性递推形式即:
记矩阵 M 的第三行第一列值为 v(M)。
故可以写成矩阵快速幂形式 gk=v(AkP)。同样的:
A 是有逆矩阵的,前缀和优化即可。时间复杂度 O(mlogn)。
ARC120F/F2 Wine Thief (3100/???)
Easy Version
Sol1(官方题解):
这个是怎么想到的
显然求出每个酒瓶被选中的次数 ansi 即可。
记序列上的总方案数为 pn,k=(n−k+1k),环上总方案数为 qn,k=pn−1,k+pn−3,k−1(枚举第一个酒瓶是否选)。
注意到如果问题在环上,那么每个位置的方案数都是相等的。棘手的地方在于所有酒瓶排成一个序列而不是环。
考虑先计算环的方案数,再将不满足环但满足序列的方案补上。可以设计这样一个算法:
- 初始令 l=1,r=n。记 len=r−l+1。
- 将 ansl,ansl+1,⋯,ansr 都加上 lennqlen,k。(环的方案数)
- 将 ansl,ansr 加上 flen−4,k−2。(同时选了 l,r,对 ansl,ansr 的贡献)
- 令 l←l+2,r←r−2,k←k−2,重复进行。(同时选了 l,r,对 ansl+2,⋯,ansr−2 的贡献)
维护差分数组即可,时间复杂度 O(n)。
注意当 l=r,k=1 时 q1,1=0,但应该计入方案中,需要特判。
Sol2:
这才是正确的做法
这里先假设 d 不一定等于 2。记序列上的总方案数为 pn,k=(n−(d−1)(k−1)k)
考虑 DP。设 fn,k,i 表示在 n 个酒瓶中选 k 个,第 i 个被选中的次数。
第 i 个被选中,要求 i−d∼i−1 及 i+1∼i+d 均不能被选。但直接将两边删去会造成额外的限制。
考虑只删去 i∼i+d,再要求 i−d∼i−1 不能选,这样限制是正确的。又由于 i−d∼i−1 中至多只能选一个,可以得到:
那么当 d=2 时,就是:
对于每个 i,前面的部分都是一样的,而最后的 fn′,k′,1=pn′−2,k′−1 容易计算。
时间复杂度 O(n)。
Hard Version
书接上文,有:
我们只关心 fn−dt,k−t 处的值。写出生成函数,记 Ft(x)=n−dt∑i=1fn−dt,k−t,ixi。那么转移即:
记 m=min(⌊nd⌋,k−1),边界条件即 Fm(x)=n−dm∑i=1xi。
记 V(x)=−d−1∑i=1xi,wt=pn−d(t+1),k−(t+1),Pt(x)=wtn−dt∑i=1xi。于是:
只需要计算:
这可以分治 NTT 解决。
当然这和普通的分治 NTT 不太一样:

如图。圆圈表示 V,方框表示 P(内部是加号),右边为低位。注意一行中每一块是 d 次多项式。
先抛掉蓝色范围外的部分(最后加上即可)。记 Pl,r(x) 表示圆圈(不带 w)的乘积(即 Vr−l+1),Ql,r(x) 表示 l∼r 行每行圆圈乘积(带 w)之和,Rl,r(x) 表示范围内的答案(钦定方框的最低位为 x0)。
总时间复杂度 O(nlognlognd)。
注意 k=1 时会导致 m=0,特判即可。
这 n 是怎么敢出到 1e6 的,如果被卡常了可以考虑特判掉 d=2。
AGC015E Mr.Aoki Incubator (3600)
又看错题了,以为速度可以为负,又想了一晚上
下面称变成 Aoki 的 Takahashi 为被标记的。
结论:设若初始标记集合 S,最终被标记的人集合为 f(S),那么 f(S⋃T)=f(S)⋃f(T)。
证明:假设最终有一个人 x∉f(S)⋃f(T),那么他不可能初始被标记,且标记他的人 x′ 同样满足 x′∉f(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 色点就在前面的数中抽 k−1 个出来。
直接 DP 只能做到 O(n2k),没有前途。
换一个思路,不定顺序,而是全局一种一种颜色地加。为了避免算重,还要定一个加入颜色的顺序。
不妨将每种非 0 颜色的第一个位置拿出来并按位置排序,按照这个顺序加入。这样相当于每次加入新颜色都要求新加入的第一个位置前面都填 0。
这样貌似已经可以做了,不过一个更巧妙的处理是将 0 色点与其它颜色分开处理。即每次加入是以下两种之一:
- 将第一个未染色的位置变成 0。
- 将包含第一个位置的某 k−1 个位置染成一种新颜色(要求染完后非 0 颜色数不能超过 0 个数)。
那么设 fi,j(i≥j) 表示已加入 i 个 0,j 种非 0 颜色。转移为:
时间复杂度 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+(n−1)c2+⋯+cn。
写成生成函数即求:
其中 y 这一维是模 p 的循环卷积。
但这个形式还套个求逆,稍难处理。
可以从另一方面作些转化:令每个 ai←ai+i−1(最后所有都需要减掉 i(i−1)/2),则将不降改为单增,相当于在 0,1,⋯,n+m−1 中选出 n 个数的集合。下面令 m←n+m,那么即求:
由于 p 很小,我们可以分开整块与零块两部分算。令 r=mmodp,m′=m−r。
枚举零块中选了 q 个数,整块中选了 n′=n−q 个数,那么分别计算:
计算 F(y)。循环卷积相当于对每个 d 求 sd=∑tfn′,tp+d,可以用单位根反演。
记 ω 为 p 次单位根,先对每个 d 求出 F(ωd)。
d=1 时,大家都知道:
这是因为左右都为 p 次多项式且最高项系数相同,且根集均为 1,ω,ω2,⋯,ωp−1。由因式定理即得左右多项式相同。
当 d≠1 时,记 g=gcd(d,p),那么会有:
令人惊讶,这是一个整式。二项式展开后 xn′ 系数即为 [(p/g)∣n′](−1)n′(−1)n′/(p/g)(gm′/pn′/(p/g))。
然后需要用单位根反演还原系数:
Sol 1(标解)
先别着急拆。注意到 F(ωi) 只与 gcd(i,p) 有关,进行一个莫比乌斯反演:
一共要做 r 次,这里的总复杂度为 O(p2d2(p))。
Sol 2(暴力)
不推式子,直接计算。当然 998244353 再强大也不可能有 500 次单位根,直接记录下来每个单位根的系数。设 si=p−1∑t=0ci,tωt。
但是系数 si 一定是整数,但结果可能是若干复数相加的形式。不过,对于某个 d,p/d−1∑t=1ωtd=−1,而由 Sol 1 的式子可以知道这些复数一定可以拆成这样的和式相加的形式,接下来需要做的就是化简。
设数组 ei,t 使得 ci,k=∑t∣kei,t,则 si=ci,0−p−1∑t=1ei,t。
莫比乌斯反演得 ei,k=∑t∣kμ(k/t)ci,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(j−1)/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)。
-
总转移式是:
答案为 n∑j=0(nj)fm,j。
暴力实现复杂度 O(nm2),使用 NTT 优化可以做到 O(nmlogm)。
事实上还有更好的方法。将转移写成指数型生成函数,可以得到:
经过一大堆无用的计算得到:
那么设 Fi(x)=m∑j=0m∑k=0gi,j,kxjekx,可以 O(m3) 转移。
考虑如何计算答案,考虑 xiejx=∑txi(jx)tt! 对答案的贡献:
于是总复杂度 O(n+m3),而且不需要 NTT。
ARC137F Overlaps (3300)
先将所有端点离散化为 2n 个点,只对线段间相对关系计数,最后除掉 (2n)!/2n 即可。记左右端点分别为左右括号。
设 fi 表示第 i 个右括号前面的左括号数 −(i−1),有限制 1≤fi≤k,fi≥fi−1−1,fn=1,方案数即 ∏fi。问题变为对所有合法的 {fi} 计算方案数之和。
考虑对第二个条件容斥,即钦定一些 fi≤fi−1−2,这样的限制形成一些连续段。
设这样的长度为 i 的连续段方案数为 fi,记 F(x)=∑i(−1)i−1fixi,那么有 11−S(x)=F(x),S(x)=1−1F(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 的方案数,那么有:
而 F0(x)=x1−x,那么求 m∑i=0gi,其中:
下面考虑求出 G(x)/x∏ni=1ai。
虽然 G(x) 的形式美观,但 m 的值域过大无法直接求解,还是考虑回原来的形式(复合与前缀和)。
考虑倒推,假设现在要求 S(B,m,k)=m∑i=0ikbi。
-
若 B(x)=A(wx),则 S(B,m,k)=wkS(A,⌊mw⌋,k)。
-
若 B(x)=11−xA(x),则(Bt 为伯努利数):
上式的前后部分均可卷积优化至 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 满足 pi≤ai。
事实上偶数这个目标根本没用,下面考虑对每个 k∈[0,n] 求出恰有 k 个 i 满足 pi≤ai 的排列数量。
即求 Ferrers 棋盘 S=F(a1+1,a2+1,⋯,an+1) 的所有 k−命中数 hk。记 k− 棋盘数为 rk,有:
而由下降幂棋盘多项式分解定理,有:
采用分治下降幂卷积可以算出 ri,再二项式反演即可得到 hi。
总时间复杂度 O(nlog2n)。
参考资料: 《2020 年集训队论文 浅谈棋盘模型在计数问题中的应用》- 彭思进
AGC009E Eternal Average (3400)
设操作次数为 d=n+m−1k−1。
把初始的 n+m 个数视为 n+m 个点,每次操作 k 个数就新建一个点作为这 k 个数对应的点的父亲。这样可以将操作对应为一棵 n+m+d 个节点的 k 叉树。
设每个点的权值为其儿子权值的平均值,则最后留下的数 s 即根节点的权值。
也即,设初始的 m 个 1 所对应的编号为 x1,x2,⋯,xm,则 s=∑mi=1k−depxi。
注意到,设初始的 n 个 0 所对应的编号为 y1,y2,⋯,yn,则有:
考虑如何判定一个 s 是否可被构造出来:
结论:s 可被构造出来当且仅当存在 x1,x2,⋯,xm 满足 ∑mi=1k−depxi=s 且存在 y1,y2,⋯,yn 满足 ∑ni=1k−depyi=1−s。
证明:必要性显然。充分性:设 zt 表示为 t 的 xi,yi 个数,只需证可以构造一棵树使得深度为 i 的叶子节点恰有 zi 个。考虑这样一个算法:
- 由 d 至 1 枚举 p,由于 ∑pt=1ztk−t=1,故 k∣zp。那么对这 zp 个点建立 zpk 个父亲节点,zp−1←zp−1+zpk,zp←0。
即可得到一棵满足条件的树。证毕。
下面考虑计数。考虑将 s,1−s 看作 k 进制小数,设 s=∑di=1aik−i,1−s=∑di=1bik−i,其中 ai,bi∈[0,k)。那么需要满足:
-
∑di=1ai=m−t1(k−1),t1∈N。
-
∑di=1bi=n−t2(k−1),t2∈N。
这是因为每一次进位都会使数位和减少 (k−1)。
,则 {bi} 即令所有 ai←k−1−ai,再令 ad←ad+1 后进位获得的结果,设进位次数为 t3,则:
故枚举 t1≤t3,统计答案。
记 A 个 [0,k) 中的整数组成的和为 B 的数列数量为 S(A,B),可以用容斥计算:
答案为:
直接暴力计算时间复杂度 O(d2mk)=O(m(n+m)2k3),无法通过。
注意到 A 不超过 d−1,B 不超过 m。枚举最后一个数是什么,用下式递推:
于是时间复杂度 O(dmk+dmk)=O(m(n+m)),可以通过。
(可能还有更优的做法?)
ABC279Ex Sum of Prod of Min (3300)
第一次用到五边形数定理
限制条件很多,但观察不出什么性质,不如直接硬上。
对第 t 个位置上填的数设出生成函数:
于是答案为:
由于 m−n≤n,故:
由五边形数定理:
模数较小,用卢卡斯定理计算组合数。注意到枚举的项数只有 O(√n) 项,时间复杂度 O(mod+√nlogmodn)。
AGC035E Develop (3700)
给每个数建一个点,数 x 向 x−2 与 x+K 连边。那么最后擦去的集合能为 S 当且仅当 S 的导出子图是 DAG。
当 K 为偶数时,奇偶数独立,且 S 合法当且仅当不包含没有奇/偶数中连续的 K/2+1 个数。那么设 dpi 表示考虑前 i 个数且第 i 个数不选的方案数,有:
可以优化到 O(n)。
当 K 为奇数时,情况较为复杂。考虑将奇数与偶数列成两列,并令数 x 向数 (x+k) 连边。为方便,记奇数连向偶数的边为 A 型边,偶数连向奇数的边为 B 型边。
(图来自博客 AGC035E Develop - 淸梣ling)
结论:若 S 的导出子图有环,则必存在一个环仅包含两条连接两侧的边。
证明:取环中最靠下的一条 A 型边 (u,v)。设 u 向下延申到 x,v 向上延伸到 y,x,y 分别与 x′,y′ 通过 B 型边连接。
-
若 y≤x′,则 (x,u,v,,x′) 已经成环。
-
若 y>x′,则如图所示。设 y 向上延申到 z。由前提假设,z≤u,那么 (y′,u,v,y) 已经成环。
故证毕。
而所有这样的环长均为 K+2,于是 S 的导出子图无环当且仅当不存在一条从左侧延伸到右侧的长为 K+2 的链。
接下来考虑计数。设 dpi,j,k 表示从上到下考虑前 i 层节点,从第 i 层右侧点延申的链长为 j,从第 i 层左侧点延伸到右侧的链长为 k。转移:
- 两侧都不选:两边的链都断掉。
- 选左侧,不选右侧:右侧的链断掉,左侧(若有链)链长加一。
- 选右侧,不选左侧:右侧的链长加一,左侧的链断掉。
- 两侧都选:右侧的链长加一,左侧的链在两种方案中取较大值。
总时间复杂度 O(n2k)。
ARC154F Dice Game (3600)
为什么省选前要做这个
提供一种不使用生成函数的暴力做法。
考虑扔 i 次已经扔出所有面的概率为 n!S2(i,n)ni,于是期望时间的 k 次方为:
为了方便计算,取一个趋近于无穷大的整数 m,只计算和式中 i≤m 的部分。
下面用 ϵ(m) 表示当 m 趋近于无穷大时值趋近于 0 的部分(于是在最终答案的计算中可以忽略)。结论:对于非负整数 k 与实数 a∈(0,1),limx→∞xkax=0。
设 k−1 次下降幂多项式 k−1∑p=0cpxp_=(x+1)k−xk。系数 cp 稍后再进行推导,下面继续计算上式:
第一个和式中,当 t≠0 时均趋近于 0,故其等于 mk+ϵ(m)。
第二个和式中,考虑求 m−1∑i=0(n−tn)iip_:
-
当 t=0 时,其等于 m−1∑i=0ip_=1p+1mp+1_。
-
当 t≠0 时,记 a=n−tn,f(x)=m−1∑i=0aixi=1−(ax)m1−ax,所求即:
于是带入得:
接下来先推导 ct:
可以发现关于 m 的部分全部消掉了。
可以分两步计算:
-
fp=n∑t=1(−1)t+1(nt)nt(n−tt)p−1
-
sk=k∑p=1p!S2(k,p)fp
第一步即计算数列 k 次幂和,使用分治乘做到 O(nlog2n+mlogm)。具体做法可见 P4705 玩游戏.
第二步,将第二类斯特林数拆开:
同样分两步计算:
-
gt=m∑p=1(−1)p(pt)fp
-
sk=m∑t=0(−1)ttkgt
第一步可以直接 NTT 计算,复杂度 O(mlogm)。
第二步同样是计算数列 k 次幂和,复杂度 O(mlog2m)。
综上,总时间复杂度 O(nlog2n+mlog2m)。
本文作者:苹果蓝17
本文链接:https://www.cnblogs.com/Appleblue17/p/15841306.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步