1. 程式人生 > >6304】Chiaki Sequence Revisited

6304】Chiaki Sequence Revisited

@Chiaki Sequence [email protected]

@題目描述[email protected]

Chiaki is interested in an infinite sequence a1,a2,a3,..., which is defined as follows:

an=1(n=1,2)
an=anan1+an1an2(n3)

Chiaki would like to know the sum of the first n terms of the sequence, i.e.

i=1nai. As this number may be very large, Chiaki is only interested in its remainder modulo (109+7).

Input
There are multiple test cases. The first line of input contains an integer T (1≤T≤10^5), indicating the number of test cases. For each test case:
The first line contains an integer n (1≤n≤10^18).
Output


For each test case, output an integer denoting the answer.

Sample Input
10
1
2
3
4
5
6
7
8
9
10
Sample Output
1
2
4
6
9
13
17
21
26
32

@大致題意@

陣列 a 遞推公式如上,求陣列 a 的字首和。

@分析 - 遇事不決先打表@

如題,數列 a 打表如下(`・ω・´):

a:1,1,2,2,3,4,4,4,5,6,6,7,8,8,8,8,9,10,10,11,12,12,12,13,14,14,15,16,16,16,16,16,…

目測好像有點兒規律的樣子(`・ω・´)
記f[x]表示 x 連續出現多少次,繼續來打波表(`・ω・´)

f:2,2,1,3,1,2,1,4,1,2,1,3,1,2,1,…

如果將f[1]減1,就可以發現 f 陣列其實真的是有規律的(`・ω・´)
f 陣列的前 1(2^1 - 1) 個:1
f 陣列的前 3(2^2 - 1) 個:1,2,1
f 陣列的前 7(2^3 - 1) 個:1,2,1,3,1,2,1
f 陣列的前 15(2^4 - 1) 個:1,2,1,3,1,2,1,4,1,2,1,3,1,2,1
這樣規律就非常明顯了嘛(`・ω・´)

@分析 - 利用規律瞎求解@

首先考慮怎麼表達“將f[1]減1”,其實這個是等價於“忽略a[1]”,我們可以將項數N-1,求解一遍字首和,再讓最後答案+1。

然後,記 s 為 f 陣列的字首和陣列,我們找到數 x 使得 s[x] <= N 且 s[x+1] > N,則最後答案為(i=1xif[i])+(Ns[x])(x+1)

考慮怎麼找這樣一個 x,因為 f 陣列有著極好的自相似性,我們考慮用倍增法。記 cnt[i]=s[2i1],則有 cnt[i]=cnt[i1]2+i,可以用類似於求 LCA 的方法求出 x :先找到最大的 p 滿足 cnt[p] <= N,如果cnt[p] + (p+1) > N,則將 2^p - 1 累加進 x,跳出迭代;否則將 2^p 累加進 x ,將 N 減去 cnt[p] + (p+1) ,繼續迭代操作。

再考慮怎麼求解i=1xif[i],我們也可以利用 f 陣列的自相似性來使用倍增法。
sum[x]=i=12x1if[i]
因為 f[1...2x11]=f[2x1+1...2x1](說白就是關於中間點對稱)
sum[x]=(i=12x11if[i])+(i=12x11(i+2x1)f[i])+2x1x