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 式子:
发现把 \((i-1)!\) 移过去再添几项凑凑系数之后,所有与 \(f_x\) 有关的项都变成了 \(\frac {f_x} {x!}\) 的形式:
注意到 \(\sum\) 实际上就是求了一段区间和,所以直接维护 \(\frac {f_i} {i!}\) 的前缀和,就做完了。
当然一些特殊情况是要特判掉的,例如 \(i\) 为奇数的情况,不过这不重要。
CD 补不了一点。
天依宝宝可爱!