您的位置:首页 > 其它

[FFT] [HDU5307] He is Flying

2017-05-29 02:57 225 查看
题目传送门

假如大家烦E文,下面是我的翻译版……

(假如翻译也不想看请直接跳到题解部分……又XJB翻译)

题目描述 Description

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

输入 Input

第一行为单独的一个整数T(T=5),表示测试数据组数。

对于每组数据,第一行包含一个整数n。第二行包含n个非负整数,表示每段的长度。如果我们把每段路的总长度表示为s,我们保证0≤s≤5×104,1≤n≤105。

输出 Output

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

嗯,吉司机……

第一眼没思路,第二眼没思路,……,第n眼没思路。

这种题一定是构造题(经验+2)。

很容易想到前缀和,记前缀和为S,这样就需要把Sj−Si−1构造进去,然后发现下标之差j−i+1还是兴奋值,这样怎么构造呢?

考虑这样的一个单项式(j−i+1)xSj−Si−1,可以通过两个多项式乘积做差得到。

(∑i=1nixSi)(∑i=1nx−Si−1)−(∑i=1nxSi)(∑i=1n(i−1)x−Si−1)

证明可以拆开来看,可以看出是完美的构造出需要的单项式的。

但是有两个问题,一个是0需要特判,在处理之前O(n)扫一遍即可,还有是指数的负数问题,可以用Sn调整零点实现。

构造第一题……

(真是看脸)

时间复杂度O(Tnlog2n)。(其实是O(TSnlog2Sn)但是做到最后Sn与n同阶了)

需要使用long double才能通过。

PoPoQQQ:“对于模一个数的计数问题必须用NTT。”

题解并没用FFT而是把模数取得非常大用CRT合并了一遍NTT……

Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: