统计蚂蚁
解题方法
设
f
i
,
j
f_{i,j}
fi,j表示前
i
i
i种类型的蚂蚁用了
j
j
j个的方案数。
则
f
i
,
j
=
∑
k
=
0
n
i
f
i
−
1
,
j
−
k
\begin{aligned}f_{i,j}=\sum_{k=0}^{n_i}{f_{i-1,j-k}}\end{aligned}
fi,j=k=0∑nifi−1,j−k
但是由于
j
j
j可能小于
n
i
n_i
ni,所以
f
i
,
j
=
∑
k
=
0
m
i
n
(
n
i
,
j
)
f
i
−
1
,
j
−
k
\begin{aligned}f_{i,j}=\sum_{k=0}^{min(n_i,j)}{f_{i-1,j-k}}\end{aligned}
fi,j=k=0∑min(ni,j)fi−1,j−k。
我们发现这种算法是
O
(
T
×
∑
i
=
1
A
n
i
)
\begin{aligned}O(T\times{\sum_{i=1}^{A}{n_i}})\end{aligned}
O(T×i=1∑Ani)。
数据很水,可以过掉。
最优方法是进行前缀和优化。
设
s
i
,
j
s_{i,j}
si,j表示前
i
i
i种类型的蚂蚁用了
0
−
j
0-j
0−j个的方案数之和。
也就是
s
i
,
j
=
∑
k
=
0
j
f
i
,
k
\begin{aligned}s_{i,j}=\sum_{k=0}^{j}{f_{i,k}}\end{aligned}
si,j=k=0∑jfi,k。
运用前缀和优化可得
s
i
,
j
=
s
i
,
j
−
1
+
f
i
,
j
s_{i,j}=s_{i,j-1}+f_{i,j}
si,j=si,j−1+fi,j。
根据上面这条式子:
f
i
,
j
=
∑
k
=
0
m
i
n
(
n
i
,
j
)
f
i
−
1
,
j
−
k
\begin{aligned}f_{i,j}=\sum_{k=0}^{min(n_i,j)}{f_{i-1,j-k}}\end{aligned}
fi,j=k=0∑min(ni,j)fi−1,j−k。
因为是求从
j
−
m
i
n
(
n
i
,
j
)
j-min(n_i,j)
j−min(ni,j)到
j
j
j的
f
f
f的第
i
i
i项的和,所以
f
i
,
j
=
s
i
−
1
,
j
−
s
i
−
1
,
j
−
m
i
n
(
n
i
,
j
)
−
1
f_{i,j}=s_{i-1,j}-s_{i-1,j-min(n_i,j)-1}
fi,j=si−1,j−si−1,j−min(ni,j)−1
由此,我们得出了求
s
i
,
j
s_{i,j}
si,j和
f
i
,
j
f_{i,j}
fi,j的公式,可以解决此问题。
时间复杂度降为
O
(
A
T
)
O(AT)
O(AT)。