[FFT] [HDU5307] He is Flying

题目传送门
假如大家烦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×(n1)种不同方法飙。如果劼劼劼从第 i i i段飙到第 j j j段,他将获得 j − i + 1 j-i+1 ji+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 0s5×104,1n105

输出 Output

对于每组数据输出 s + 1 s+1 s+1行,第 i i i行的单独一个整数表示如果劼劼劼能飙完所有 i − 1 i-1 i1长的路,他能获得的总兴奋值。

嗯,吉司机……
第一眼没思路,第二眼没思路,……,第n眼没思路。
这种题一定是构造题(经验+2)。
很容易想到前缀和,记前缀和为 S S S,这样就需要把 S j − S i − 1 S_j-S_{i-1} SjSi1构造进去,然后发现下标之差 j − i + 1 j-i+1 ji+1还是兴奋值,这样怎么构造呢?
考虑这样的一个单项式 ( j − i + 1 ) x S j − S i − 1 (j-i+1)x^{S_j-S_{i-1}} (ji+1)xSjSi1,可以通过两个多项式乘积做差得到。
( ∑ 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=1nixSi)(i=1nxSi1)(i=1nxSi)(i=1n(i1)xSi1)
证明可以拆开来看,可以看出是完美的构造出需要的单项式的。
但是有两个问题,一个是 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值