luogu#P10259. [COCI 2023/2024 #5] Piratski kod

[COCI 2023/2024 #5] Piratski kod

题目背景

译自 COCI 2023/2024 Contest #5 T3「Piratski kod

题目描述

Marrrtina 船长和她的海盗团队,在搜索了三个月之后,终于挖掘出一箱属于最著名的意大利海盗的失落宝藏。但是,要打开这个宝箱,她需要一个密码,该密码被描述在宝箱旁边的一个瓶子中的一条信息中。

信息如下:


只有最有价值的海盗才能打开宝箱,密码是以下谜题的答案:对于长度为 aa 的二进制序列 ss,且其中唯一的连续两个 11 位于序列的末尾,如果满足以下条件,它是一个数字 xx​ 的海盗表示:

$$s[0]\cdot \text{Fib}[2] + s[1]\cdot \text{Fib}[3] + s[2]\cdot \text{Fib}[4] + \ldots + s[a − 2]\cdot \text{Fib}[a] = \sum_{i=0}^{a-2} s[i]\cdot \text{Fib}[2 + i] = x $$

这里的 Fib[x]\text{Fib}[x] 表示第 xx 个斐波那契数。斐波那契数的定义如下:Fib[1]=1\text{Fib}[1] = 1Fib[2]=1\text{Fib}[2] = 1,对于每个 y>2y > 2,$\text{Fib}[y] = \text{Fib}[y − 1] + \text{Fib}[y − 2]$。

例如,11p=111_p = 1011p=2011_p = 21010011p=171010011_p = 17,这里的 pp 表示数字的海盗表示。

海盗代码是一个二进制序列(没有关于连续 11 的任何条件),代表一系列正整数的序列。为了阅读它,我们将其分割为尽可能多的部分,这些部分是某些数字的海盗表示(可能还有一个不是任何数字的海盗表示的后缀),并按顺序写出这些整数。例如,我们将 0111101011010101111010110101 分割为 01111010110101011|11|01011|0101,最后一部分不是海盗表示,因此我们删除它,得到 0111101011011|11|01011,并读到序列 2,1,72,1,7

海盗代码的值等于解码后的正整数序列的值之和。前面的密码的值为 1010

我最喜欢的数字 PP 是长度为 kk 的所有海盗代码值的总和。由于该数字可能很大,打开宝箱的密码是 PP 除以 109+710^9 + 7 的余数。

Leonarrrdo da Pisa


如果 Marrrtina 无法打开宝箱,她的船员将认为她不值得信任,并将她逼上走板。

输入格式

一行一个整数 n (n5 000)n\ (n\le 5\ 000)

输出格式

输出一行 nn 个整数,其中第 kk 个整数表示长度为 kk 的密码谜题的答案。

4

0 1 4 16

提示

样例解释 1

长度为 11 的代码是 0011,它们的值都是 00

代码 1111 的值为 11,其余所有长度为 22 的代码值都是 00

代码 11111111 的值为 2200110011 的值为 33

子任务

Subtask Points Constraints
1 20 n=20n=20
2 40 n=300n=300
3 50 n=5000n=5000