6304】Chiaki Sequence Revisited
@Chiaki Sequence [email protected]
@題目描述[email protected]
Chiaki is interested in an infinite sequence , which is defined as follows:
Chiaki would like to know the sum of the first n terms of the sequence, i.e.
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,則最後答案為。
考慮怎麼找這樣一個 x,因為 f 陣列有著極好的自相似性,我們考慮用倍增法。記 ,則有 ,可以用類似於求 LCA 的方法求出 x :先找到最大的 p 滿足 cnt[p] <= N,如果cnt[p] + (p+1) > N,則將 2^p - 1 累加進 x,跳出迭代;否則將 2^p 累加進 x ,將 N 減去 cnt[p] + (p+1) ,繼續迭代操作。
再考慮怎麼求解,我們也可以利用 f 陣列的自相似性來使用倍增法。
記。
因為 (說白就是關於中間點對稱)
有
即