Gijswijt序列
* * * *
拉格朗日计划
* * * *
Gijswijt序列

Gijswijt序列是一种增长十分缓慢的数列,该数列中的每一项都是此前重复次数最多的后缀子列。

具体来说,第n项$g_n$的值可以这样来计算:

考察长度为k的后缀子列$g_{n-k},\ldots,g_{n-1}$,若$g_{n-2k},\ldots,g_{n-k-1}$与$g_{n-k},\ldots,g_{n-1}$相等,那么就称后缀子列$g_{n-k},\ldots,g_{n-1}$重复了两次。

类似地,若子列$g_{n-mk},\ldots,g_{n-(m-1)k-1}$,子列$g_{n-(m-1)k},\ldots,g_{n-(m-2)k-1}$,。。。,子列$g_{n-k},\ldots,g_{n-1}$都完全相同,那么就称后缀子列$g_{n-k},\ldots,g_{n-1}$重复了m次。

对每个$k$,记后缀子列$g_{n-k},\ldots,g_{n-1}$的最大重复次数为$m_k$,亦即长度为mk的后缀子列$g_{n-mk},\ldots,g_{n-1}$是由长度为k的后缀子列$g_{n-k},\ldots,g_{n-1}$重复m次所得。

那么$g_n=\max_km_k$。

该序列的第一项规定为1,前几项依次是1, 1, 2, 1, 1, 2, 2, 2, 3, 1...,下面的例子阐释了每一项的计算过程,每一步中重复次数最多的后缀子列都标记在了方括号[]中 。

                [1]
                [1],[1]
                 1 , 1 ,[2]
                 1 , 1 , 2 ,[1]
                 1 , 1 , 2 ,[1],[1]
                [1 , 1 , 2],[1 , 1 , 2]
                 1 , 1 , 2 , 1 , 1 ,[2],[2]
                 1 , 1 , 2 , 1 , 1 ,[2],[2],[2]
                 1 , 1 , 2 , 1 , 1 , 2 , 2 , 2 ,[3]
                 1 , 1 , 2 , 1 , 1 , 2 , 2 , 2 , 3 , 1
              
打印该数列的前1000项,每个数单独一行。

注:原题面的说明不甚明确,此处添加了准确的定义。

本题难度:



解答

前1000项中没有超过4的项,因此先枚举重复次数(1到4),再枚举重复的后缀子列来生成$g_n$。

最终代码只有两行。

代码长度:113字节 vs. 全站第一:78字节。

g=[1]
exec('print(g[-1]);g+=[max(i*(g[-i*m:]==g[-m:]*i)for i in range(1,5)for m in range(1,len(g)//i+1))];'*1000)