考虑在 \(A\) 的前 \(100\) 位递增地填上 \(1 \to 100\)。
如果我们限制 \(A\) 的后 \(100\) 位里,\(1 \sim 100\) 每个数最多出现一次。后 \(100\) 位可以不填满。
那么 \(A\) 中好的子序列数量,就是后 \(100\) 位里严格上升子序列的数量。
问题转化成:构造一个序列 \(B\):
- \(1 \sim 100\) 每个数最多出现一次。
- 严格上升子序列数等于 \(N\)。
构造方式如下:
枚举 \(x\) 从 \(1 \to 100\),将 \(x\) 插入 \(B\) 中。
将 \(x\) 插入 \(B\) 的后侧,会让 \(B\) 的严格上升子序列数 \(\times 2\)。
将 \(x\) 插入 \(B\) 的前侧,会让 \(B\) 的严格上升子序列数 \(+1\)。
将 \(N\) 二进制拆分即可。上面的 \(x\) 最多运行到 \(2\log N\) 就能构造成功了。
构造出来的 \(B\) 长度 \(2\log N\),对应 \(A\) 的长度 \(100 + 2\log N\)。
如果最开始的时候只将这 \(2\log N\) 个数递增地放在 \(A\) 的最开始,可以做到串长 \(4\log N\)。
构造时间复杂度 \(\Theta(\log N)\)。
标签:log,Tautonym,Puzzle,构造,AGC12C,序列,100 From: https://www.cnblogs.com/crab-in-the-northeast/p/agc12c.html