重庆八中集训 day2
摆了,怎么办啊。
CF286E[Ladies shop]
题意
给你一个集合 \(S\) 然后选出来一个子集(一个数字可以用很多次),然后拼出来的集合等于 \(S\) 的最小集合。
题解
数的上界为 \(M\)。令 \(i = 0\) 加入 \(S\)。
我们思考一下,令原来的东西 \(F(x) = \sum_{i = 0} ^ {M} [i \in S] x ^ i\),之后捏,考虑如果你可以全部拼出来 \(S\) 的话,那么就要求,我用 \(S\) 里的数字拼不出来 \(S\) 以外的才对。所以对于 \(G(x) = F^ 2(x)\) 的话,那么就有对于每个 \(g_i \not = 0\) 就有 \(f_i \not = 0\) 才对。
然后判断最小就是一个数字只能被自己拼出来,自然就是满足 \(g_i = 2\) 才对。
CF960G[Bandit Blues]
题意
你要求出满足这些条件的 \(1\sim N\) 排列的方案数:
- 前缀最大值有 \(A\) 个,后缀最大值有 \(B\) 个。
题解
一个想法,考虑枚举最大值 \(N\) 的位置,那么两边的情况是不影响的。
我们令 \(f_{i, j}\) 表示 \(i\) 个互不相同的数字,排成一排有 \(j\) 个前缀最大值的方案数,考虑从小到大(不好做,因为插入大数字的时候会对于前面状态做影响),考虑从大到小,我们可以得到转移 \(f(i, j) = f(i - 1, j - 1) + (i - 1) \times f(i - 1, j)\),然后发现这居然是第一类斯特林数。
那么答案就是 \(\sum_{i = 1} ^ N \binom{N - 1}{i - 1} f(i - 1, A - 1)f(N - i, B - 1)\)。
发现这玩意的组合意义,就是你把 \(N - 1\) 个数字分成 \(A + B - 2\) 个轮换,然后选出来 \(A - 1\) 个放在最大值前面的方案数。那么答案应该是 \(f(N - 1, A + B - 2) \binom{A + B - 2}{A - 1}\)
时间复杂度为 \(O(N \log ^ 2N)\),就是需要求第一类斯特林数,其实可以用多项式快速幂做到 \(N\log N\)。
CF986[Perfect Encoding]
题意
给你一个 \(N\) 位的大整数 \(A\),满足求一些 \(a_i\),使得 \(\prod _i a_i \ge A\) 并且 \(\sum_{i} a_i\) 最小。
题解
发现 \(a_i\) 只可能是 \(2,3\),并且 \(2\) 最多有 \(2\) 个,因为 \(2^ 3 < 3 ^ 2\),那么三的个数会尽量大,大概是 \(l = \log_3(A) - 1\) 这么多个,然后我们只要检查 \(3 ^ {ln - 1}, 2 \times 3 ^ {ln - 1}, 4\times 3 ^ {ln - 2}, 3 ^ {ln}\) 次方谁符合条件选个最优秀的就好了。
然后,我们发现需要怎么办,你可能需要一个算 \(3 ^ x\) 的东西,高精度快速幂,发现可以用FTT实现,复杂度用牛顿迭代法分析可以得到是 \(O(N\log N)\) 的。
非常麻烦。
CF623E[Transforming Sequence]
题意
叫你统计这种长度为 \(N\) 的数组的个数,\(a_i \in [1, 2 ^ k)\),满足前缀或单调递增。求这些数组的个数,答案对于 \(1e9 + 7\) 取模。
题解
前缀或单调递增只能是新增了某些位 \(1\),所以很明显发现 \(N > K\) 的时候答案为 \(0\)。
然后考虑设 \(f_{i, j}\) 表示 \(i\) 个数字,用了 \(j\) 位的方案数,然后答案 \(ans = \sum_{j = 1} ^ K \binom{K}{j} f_{n, j}\)。
然后转移可以:
直接发现,这玩意就是个卷积,然后发现,转移的时候不用一个一个转移,可以直接合并 \(n,m\) 长度的状态
如果直接倍增,暴力卷积,可以做到 \(K ^ 2 \log N\),过不去。否则的话,用 \(NTT\) 优化转移可以做到 \(K \log K \log N\),我并没有这么做,我写了一种 \(O(K ^ {\log _2 (3)} \log N)\) 的做法
具体的,我们分治优化卷积即可,就是可以这么计算,\([l, mid]\) 自己卷上自己的贡献,然后 \([mid + 1 ,r]\) 的贡献,之后把 \([l,mid]\) 和 \([mid + 1, r]\) 加在一起,卷自己,然后减去重复的贡献即可。
[AGC021F]Trinity
题意
你有一个 \(N\times M\) 的网格,其中有一些格子是黑色的,一些是白色的:
你有三个数组 \(A, B, C\)
- \(A\) 数组是 \(1\sim N\) 中每一行第一个黑格子的纵坐标,不存在则为 \(M + 1\)
- \(B\) 数组是 \(1\sim M\) 中每一列第一个黑格子的横坐标,不存在则为 \(N + 1\)
- \(C\) 数组是 \(1\sim M\) 中每一列最后一个黑格子的横坐标,不存在则为 \(0\)
求不同的三元对 \((A, B, C)\) 的个数,对于 \(998244353\) 取模
题解
我们设 \(f_{i, j}\) 表示 \(i\times j\) 的格子,之后答案就是 \(ans = \sum_{i = 0} ^ n \binom{n}{i} f_{i, m}\) 然后方案数。之后,考虑从后添加每一列,如果这一列没有添加新的行,那么我们只关心这一列黑格子的最大值和最小值,于是考虑枚举即可,则 $f_{i, j - 1} \times \left(1 + \frac{(i +1) \times i}{2}\right) $。
否则如果加入了新的格子,那么我们枚举原来的格子的个数 \(k\),发现我们还是很需要这一列黑色格子的上下界,怎么办?我们考虑黑色格子的最上方的上面一个格子肯定是白色,黑色格子最下面的格子的下面的格子肯定是白色,那么我们相当于是,要从 \(i + 2\) 行中选出来 \(i - k + 2\) 行来。
那么贡献是 \(f_{k, j - 1} \times \binom{i + 2}{i -k + 2} \to f_{i, j}\)。