题目传送门。
假如大家烦E文,下面是我的翻译版……
(假如翻译也不想看请直接跳到题解部分……又XJB翻译)
题目描述 Description
劼劼劼想沿着一条漫长的路飙车,这条路有 n n n段,第 i i i段有一非负整数的长度 s i s_i si。劼劼劼将选择一些连续部分在上面飙车(以一个不可思议的速度),所以共有 n × ( n − 1 ) 2 \frac{n\times (n-1)}{2} 2n×(n−1)种不同方法飙。如果劼劼劼从第 i i i段飙到第 j j j段,他将获得 j − i + 1 j-i+1 j−i+1点兴奋值。现在劼劼劼想知道,如果他尝试所有长为 s s s的路,它能获得的总兴奋值是多少。请注意在本题中,一段路的长度可以是 0 0 0,意味着长度太短可以认为是 0 0 0。
输入 Input
第一行为单独的一个整数 T T T( T = 5 T=5 T=5),表示测试数据组数。
对于每组数据,第一行包含一个整数 n n n。第二行包含 n n n个非负整数,表示每段的长度。如果我们把每段路的总长度表示为 s s s,我们保证 0 ≤ s ≤ 5 × 1 0 4 , 1 ≤ n ≤ 1 0 5 0\le s\le 5\times 10^4,1\le n\le 10^5 0≤s≤5×104,1≤n≤105。
输出 Output
对于每组数据输出 s + 1 s+1 s+1行,第 i i i行的单独一个整数表示如果劼劼劼能飙完所有 i − 1 i-1 i−1长的路,他能获得的总兴奋值。
嗯,吉司机……
第一眼没思路,第二眼没思路,……,第n眼没思路。
这种题一定是构造题(经验+2)。
很容易想到前缀和,记前缀和为
S
S
S,这样就需要把
S
j
−
S
i
−
1
S_j-S_{i-1}
Sj−Si−1构造进去,然后发现下标之差
j
−
i
+
1
j-i+1
j−i+1还是兴奋值,这样怎么构造呢?
考虑这样的一个单项式
(
j
−
i
+
1
)
x
S
j
−
S
i
−
1
(j-i+1)x^{S_j-S_{i-1}}
(j−i+1)xSj−Si−1,可以通过两个多项式乘积做差得到。
(
∑
i
=
1
n
i
x
S
i
)
(
∑
i
=
1
n
x
−
S
i
−
1
)
−
(
∑
i
=
1
n
x
S
i
)
(
∑
i
=
1
n
(
i
−
1
)
x
−
S
i
−
1
)
(\sum\limits_{i=1}^nix^{S_i})(\sum\limits_{i=1}^nx^{-S_{i-1}})-(\sum\limits_{i=1}^nx^{S_i})(\sum\limits_{i=1}^n(i-1)x^{-S_{i-1}})
(i=1∑nixSi)(i=1∑nx−Si−1)−(i=1∑nxSi)(i=1∑n(i−1)x−Si−1)
证明可以拆开来看,可以看出是完美的构造出需要的单项式的。
但是有两个问题,一个是
0
0
0需要特判,在处理之前
O
(
n
)
O(n)
O(n)扫一遍即可,还有是指数的负数问题,可以用
S
n
S_n
Sn调整零点实现。
构造第一题……
(真是看脸)
时间复杂度
O
(
T
n
log
2
n
)
O(Tn\log_2 n)
O(Tnlog2n)。(其实是
O
(
T
S
n
log
2
S
n
)
O(TS_n\log_2S_n)
O(TSnlog2Sn)但是做到最后
S
n
S_n
Sn与
n
n
n同阶了)
需要使用long double才能通过。
PoPoQQQ:“对于模一个数的计数问题必须用NTT。”
题解并没用FFT而是把模数取得非常大用CRT合并了一遍NTT……
Code