ZR 2025 NOIP 二十连测 Day 2

怎么暴力全 T 了 /ll,虽然不 T 也没多少分吧()


25noip二十连测day2

链接:link
题解:题目内

时间:4.5h (2025.10.14 13:40~18:10)
题目数:4
难度:

A B C D
\(\color{#F39C11} 橙\) \(\color{#3498DB} 蓝\) \(\color{#BFBFBF} ?\) \(\color{#BFBFBF} ?\)
*1100 *2100 *? *?

估分:100 + 56 + 4 + 16 = 176
得分:100 + 56 + 0 + 0 = 156
Rank:78/127


场祭

读题。

开 A,啊非十进制下小数是啥啊?这玩意完全没听说过呀 /yun

哦原来是竖式除法就可以算出来,好的暴力会了,但是正解还是不会,循环节最长能达到 \(b\) 会 T 飞。

于是打暴力!然后发现暴力就是在求一个快速幂,于是做完了。这就是面向代码编程吗,挺离谱的(

看看暴力,B 一眼笛卡尔树,有容易的 \(O(n^2)\) dp,再用同样的 dp 加个剪枝可以拼上特殊性质拿到 56pts。C 只会 4pts 暴力。D 只会 8pts 暴力。

于是写 B,发现没过样例,把剪枝去掉发现连小样例都没过,瞪了一会儿发现组合数上标应该是 \(i-1\) 的,改了就过了。

C 暴力是好打的。

D 暴力是不好打的,不过调了调也过掉了,甚至 \(n \le 15\) 都能跑到起飞(600ms)。

还剩 1h,发现 D 有个 \(a_i \le 2\) 的特殊性质,先 \(a_i \gets a_i-1\),于是难点在于处理循环,然后发现一个数 \(a_i\) 可以被选当且仅当 \([1,i)\)\(0\) 的个数多于 \(1\) 的个数,发现这个差值是可以分块维护的,写写写,调调调。没过样例!死因是没有考虑 \(111\ldots\) 这样的情况中第三个 \(1\) 是可以被选的,所以还要算上上面那个差值为偶数的情况。

但是没时间了。


补题

怎么 CD 暴力全 T 了喵。怎么 CD 暴力全 T 了喵。怎么 CD 暴力全 T 了喵。怎么 CD 暴力全 T 了喵。怎么 CD 暴力全 T 了喵。

补 B,找那个 dp 的性质。

dp 是长这样的:令 \(f_i\) 为长度为 \(i\) 的排列的方案数,考虑钦定最大值的位置再把贡献分到两边的子区间上,有转移:

\[f_i = \sum _{j \in [1,i] \land j \times (i-j+1) \le m} \binom {i-1} {j-1} \cdot f_{j-1} \times f_{i-j} \]

发现当长度为 \(i\) 的区间无论怎么划分都合法的时候,那么长度 \(\le i\) 的区间一定都是可以随便划分的,方案数为长度的阶乘。也就是说当 \(\lceil i/2 \rceil \times \lfloor i/2+1 \rfloor \le m\) 时,\(f_i = i!\)

对于一个长度为 \(i\)不能任意划分的区间,考虑它从哪些地方转移,因为必须要求 \(j \times (i-j+1) \le m\) 才能从 \(f_{j-1} \times f_{i-j}\) 转移,那么如果令 \(x = j-1 \le i-j\),则 \(x\) 必须乘上一个比自身大的数才能使得 \(\lceil x/2 \rceil \times \lfloor x/2+1 \rfloor \le m\),所以 \(f_{j-1}\) 一定是可以随便划分的,即 \(f_{j-1} = (j-1)!\)

于是根据这个再转化一下 dp 式子:

\[\begin{aligned} f_i & = 2 \sum _{j \in [1,i/2] \land j \times (i-j+1) \le m} \binom {i-1} {j-1} (j-1)! \times f_{i-j} \\ f_i & = 2 (i-1)! \sum _{j \in [1,i/2] \land j \times (i-j+1) \le m} \frac 1 {(i-j)!} \times f_{i-j} \\ \end{aligned} \]

发现把 \((i-1)!\) 移过去再添几项凑凑系数之后,所有与 \(f_x\) 有关的项都变成了 \(\frac {f_x} {x!}\) 的形式:

\[\frac {f_i} {i!} = \frac 2 i \sum _{j \in [1,i/2] \land j \times (i-j+1) \le m} \frac {f_{i-j}} {(i-j)!} \]

注意到 \(\sum\) 实际上就是求了一段区间和,所以直接维护 \(\frac {f_i} {i!}\) 的前缀和,就做完了。

当然一些特殊情况是要特判掉的,例如 \(i\) 为奇数的情况,不过这不重要。

CD 补不了一点。


天依宝宝可爱!

posted @ 2025-10-14 20:28  little__bug  阅读(6)  评论(0)    收藏  举报