0805 模拟赛

T1

\(x\) 是好数当且仅当,\((10^k-1)\cdot x\) 十进制不含 \(9\),求第 \(n\) 大的好数。

\(k\leq 18\), \(n \leq 10^{18}\)

题解

首先考虑统计合法的 \((10^k-1)\cdot x\),最后再除去 \(10^k-1\)

那考虑 \(10^k-1\) 的倍数需要满足的条件:把数每 \(k\) 位分成一段,然后加起来,是 \(10^k-1\) 的倍数则可以。

相当于对这些分段之后的数,要做一次竖式加法,所以我们确定的顺序应该是竖式加法中的低位往高位。我们枚举每一种竖式加法的结果 \(sum\),然后 \(dp_{i,j}\) 表示已经填了竖式上最低 \(i\) 位的所有位置,使得竖式最低 \(i\) 位的结果相同,并且进位为 \(j\)。这样就可以求出位数 \(\leq i\) 的合法数有多少个了,借此可以确定答案的位数。

然后固定一个答案的前缀,求剩下的位的填法,相当于改变了 \(sum\),还是枚举 \(sum\) 暴力 DP。

看起来非常暴力,但一位同学告诉我是可以过的。复杂度我不会算,暂且认为是 O(能过) 吧!

T2

每面贡献独立,并且 \(a,b\) 的选法只有 \(O(n)\) 种,所以贡献类似于 \(f_i+f_j-4ij\),这不斜率优化了。但是我还是写李超树,因为我不会斜率优化 /cf

T3

zero2.out 说的还不够多吗?

一堆固定的正数,加上一堆明显大得多的负数,那猜想每个负数只会用一次。

事实确实如此,为保证这点,负数必须大于正数之和的一半。此时使用了这个负数对答案的贡献是,用正数组合出之的方案数。这样就是个背包了!

所以随便手动调整一下正数集合不就完事了?但是我非常愚蠢,没想到可以直接把 zero2.out 里面的正数集合复制过来用。

posted @ 2022-08-05 12:21  Ilith  阅读(71)  评论(2编辑  收藏  举报