题目传送门
接着翻译:(这次翻译可能不太好……)
题目描述 Description
也许大海对贝壳的定义是珍珠。然而在我看来,一串带有 n n n个美丽的贝壳的贝壳项链包含着我对我最爱的Arrietty最真挚的感情。
假设这串贝壳项链是一个贝壳序列(不是一个环?)。考虑项链中连续 i i i个贝壳,我知道存在不同的方案去装饰这 i i i个贝壳作为一个爱的宣言(什么鬼???)。
我想用几个爱的宣言装饰所有的贝壳并且只装饰每个贝壳一次。作为一个问题,我想知道方案的总数。
输入 Input
有多组数据(不多于 20 20 20组,并且极限数据不多于 1 1 1组),以 0 0 0结束;
对于每组数据,第一行包含一个整数 n n n,表示这串贝壳项链的贝壳数, 1 ≤ n ≤ 1 0 5 1\le n\le 10^5 1≤n≤105。接着一行为 n n n个数的非负整数序列 a 1 a_1 a1~ a n a_n an, a i ≤ 1 0 7 a_i\le 10^7 ai≤107,表示装饰连续 i i i个段的方案数。
输出 Output
对于每组数据,输出一个行表示总方案数对 313 313 313取模( 313 313 313表示3月13号,一个特殊而有目的的一天)。
题里说的太含糊了……其实题意为:
对于一段长为 i i i的序列有 a [ i ] a[i] a[i]种装饰方法,求装饰一段长为 n n n的序列有多少种方法。
很显(kan)而(bu)易(chu)见(lai)的一个DP方程:用
d
p
[
i
]
dp[i]
dp[i]表示装饰长度为
i
i
i的序列的方案数,转移如下:
d
p
[
i
]
=
∑
j
=
1
i
−
1
d
p
[
j
]
a
[
i
−
j
]
dp[i]=\sum\limits_{j=1}^{i-1}dp[j]a[i-j]
dp[i]=j=1∑i−1dp[j]a[i−j]
暴力是
O
(
n
2
)
O(n^2)
O(n2)的过不去。
可以发现中间的部分是个类似卷积的形式,所以我们考虑怎么做这个卷积。
d
p
[
i
]
dp[i]
dp[i]是推出来的如果没有值就无法做卷积……
那么就先将它做出来……
mdzz那不还是
O
(
n
2
)
O(n^2)
O(n2)的?
我们需要用到CDQ分治来求……(CDQ分治太强大了%%%),对于一个区间先递归左边,然后计算左边对右边的贡献,加进去,然后递归右边……
那么就非常好了,时间复杂度是
O
(
n
log
2
2
n
)
O(n\log_2^2n)
O(nlog22n)的。
(其实是这样的一个递推式:
T
(
n
)
=
2
T
(
n
2
)
+
O
(
n
log
2
n
)
T(n)=2T(\frac{n}{2})+O(n\log_2n)
T(n)=2T(2n)+O(nlog2n))
Code