D.自描述序列
题目描述:
定义自描述序列为 $ G(n) $ :
- 对于任意正整数n,n在整个序列中恰好出现 $ G(n) $ 次。
- 该序列是不下降的
前几项为
$ n $ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
$ g(n) $ | 1 | 2 | 2 | 3 | 3 | 4 | 4 | 4 | 5 |
求第 $ n $ 项
数据范围:
$ 1\le n \le 2\times 10^{15} $
题解:
数据范围非常大,肯定不能直接求。观察 $ G(n) $ 数组,发现 $ G(n) $ 里面的数比较小,而且呈阶梯状,可以考虑使用 $ F(n) $ 表示 $ G(n) $ 中 $ n $ 的最大下标。前几项为
$ n $ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
$ g(n) $ | 1 | 2 | 2 | 3 | 3 | 4 | 4 | 4 | 5 |
$ f(n) $ | 1 | 3 | 5 | 8 | 11 | 15 | 19 | 23 | 28 |
然后对 $ F(n) $ 中的直接使用二分查找,找到对应的下标即可。比如 $ g(6) $ ,在 $ F(n) $ 中找大于等于 $ 6 $ 的数的下标,为 $ 4 $ ,可以得到答案。但是经过运算发现根本存不下,数量级增加的有点慢
还可以考虑什么 $ n $ 达到什么数的时候,数据量超过 $ maxn $ 。经过打表发现, $ n $ 在 $ 10^6 $ 内,这样应该可以。使用 last_cnt
表示当前的 $ g(n) $ 的数字总量,last_p
表示当前 $ g(n) $ 数组的最后一个阶梯的数。同时 $ last\_cnt = \sum{i \times g(i)},last_p = \sum{g(i)} $ 。直接枚举 $ i $ 计算 last_cnt
和 last_p
的值,当超过 $ n $ 的时候,减掉最后一项,此时小于 $ n $ ,判断从 last_p
开始需要几个即可
代码:
1 | /** |