[FFT] [HDU5307] He is Flying

来源:互联网 发布:php html5 关系 编辑:程序博客网 时间:2024/06/05 06:23

题目传送门。
假如大家烦E文,下面是我的翻译版……
(假如翻译也不想看请直接跳到题解部分……又XJB翻译
题目描述 Description

劼劼劼想沿着一条漫长的路飙车,这条路有n段,第i段有一非负整数的长度si。劼劼劼将选择一些连续部分在上面飙车(以一个不可思议的速度),所以共有n×(n1)2种不同方法飙。如果劼劼劼从第i段飙到第j段,他将获得ji+1点兴奋值。现在劼劼劼想知道,如果他尝试所有长为s的路,它能获得的总兴奋值是多少。请注意在本题中,一段路的长度可以是0,意味着长度太短可以认为是0

输入 Input

第一行为单独的一个整数TT=5),表示测试数据组数。
对于每组数据,第一行包含一个整数n。第二行包含n个非负整数,表示每段的长度。如果我们把每段路的总长度表示为s,我们保证0s5×104,1n105

输出 Output

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

嗯,吉司机……
第一眼没思路,第二眼没思路,……,第n眼没思路。
这种题一定是构造题(经验+2)。
很容易想到前缀和,记前缀和为S,这样就需要把SjSi1构造进去,然后发现下标之差ji+1还是兴奋值,这样怎么构造呢?
考虑这样的一个单项式(ji+1)xSjSi1,可以通过两个多项式乘积做差得到。

(i=1nixSi)(i=1nxSi1)(i=1nxSi)(i=1n(i1)xSi1)

证明可以拆开来看,可以看出是完美的构造出需要的单项式的。
但是有两个问题,一个是0需要特判,在处理之前O(n)扫一遍即可,还有是指数的负数问题,可以用Sn调整零点实现。
构造第一题……
(真是看脸)
时间复杂度O(Tnlog2n)。(其实是O(TSnlog2Sn)但是做到最后Snn同阶了)
需要使用long double才能通过。
PoPoQQQ:“对于模一个数的计数问题必须用NTT。”
题解并没用FFT而是把模数取得非常大用CRT合并了一遍NTT……
Code

原创粉丝点击