题目:
https://ac.nowcoder.com/acm/problem/14532
每个种群有
N
N
N个不同个体,围成一个圈,每隔一个单位时间都会生长。
在一个单位时间里,每个个体会向两边辐射能量,辐射范围与强度均为
K
K
K,随着距离的增加辐射强度会减小,距离每增加
1
1
1辐射强度减小
1
1
1 ,在这单位时间通过辐射接受的能量会保留,最开始的能量会消耗掉。对于两个个体
a
a
a,
b
b
b,其中
a
a
a对
b
b
b的辐射会使
b
b
b增加【辐射强度
×
a
×a
×a最开始的能量值】。总体的改变可以表示成
a
i
′
=
∑
j
=
1
n
[
K
−
d
i
s
(
i
,
j
)
>
0
]
[
i
≠
j
]
(
K
−
d
i
s
(
i
,
j
)
)
a
[
j
]
a_i^{'}=\sum_{j=1}^{n}[K-dis(i,j)>0][i\neq j](K-dis(i,j))a[j]
ai′=j=1∑n[K−dis(i,j)>0][i=j](K−dis(i,j))a[j]
思路:
可以发现这是一个线性变换,系数都是确定的。
A
[
a
1
a
2
.
.
a
n
]
=
[
a
1
′
a
2
′
.
.
a
n
′
]
\boldsymbol A\begin{bmatrix}a_1\\a_2\\.\\.\\a_n\end{bmatrix}=\begin{bmatrix}a_1^{'}\\a_2^{'}\\.\\.\\a_n^{'}\end{bmatrix}
A⎣⎢⎢⎢⎢⎡a1a2..an⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡a1′a2′..an′⎦⎥⎥⎥⎥⎤
A
\boldsymbol A
A是一个
n
∗
n
n*n
n∗n的矩阵,通过题目公式确定。但是这样矩阵乘法是
O
(
n
4
)
O(n^4)
O(n4),会发现这个矩阵每行是循环的,两个循环矩阵相乘还是循环矩阵,所以每次计算只要计算出第一行,之后几行通过循环得到。