题目传送门
(POJ原地址,如果上不去请看这里)
还是翻译:
题目描述 Description
细胞自动机是处在一个特定形状网格上的一组细胞,这些细胞按照一组基于相邻细胞的状态描述新状态的规则通过一系列离散的时间进化。细胞自动机的顺序是它包含的细胞数量。一个顺序为 n n n的细胞自动机中的细胞编号为 1 1 1~ n n n。
细胞的顺序是它可能包含的不同价值数。通常情况下,顺序为 m m m的细胞的价值为 0 0 0~ m − 1 m-1 m−1的整数。
细胞自动机的基本特性之一是它进行计算时网格的类型。在这个问题中我们考虑一种特殊形状的细胞自动机——环状细胞自动机。这种自动机有 n n n个细胞,每个细胞有 m m m种价值。我们把这种细胞自动机表示为 n , m n,m n,m——自动机。
在 n , m n,m n,m——自动机里, i i i细胞与 j j j细胞的距离被定义为 min ( ∣ i − j ∣ , n − ∣ i − j ∣ ) \min(|i-j|,n-|i-j|) min(∣i−j∣,n−∣i−j∣)。一个 d d d——环境细胞指的是与这个细胞的距离不大于 d d d的细胞集合。
每 d d d步之内的细胞价值会被新价值统一取代。在 d d d步后细胞 i i i的新价值计算为属于这个细胞的 d d d——环境内所有细胞的价值对 m m m取模。
下面这张图片显示了 5 , 3 5,3 5,3——自动机进行 1 1 1步操作。
问题是计算 n , m n,m n,m——自动机进行了 k k k次 d d d步操作之后的状态。
输入 Input
第一行包含了 4 4 4个整数为 n , m , d , k ( 1 ≤ n ≤ 500 , 1 ≤ m ≤ 1 0 6 , 0 ≤ d < n 2 , 1 ≤ k ≤ 1 0 7 ) n,m,d,k(1\le n\le 500,1\le m\le 10^6,0\le d<\frac{n}{2},1\le k\le 10^7) n,m,d,k(1≤n≤500,1≤m≤106,0≤d<2n,1≤k≤107)。第二行包含 n n n个从 0 0 0到 m − 1 m-1 m−1的整数,表示自动机内细胞的初始价值。
输出 Output
输出 n , m n,m n,m——自动机进行了 k k k次 d d d步操作之后的状态。
还是没看懂?
有 n n n个数围成一个环,现在有一种变换,将所有距离第 i ( 1 ≤ i ≤ n ) i(1\le i\le n) i(1≤i≤n)个数小于等于 d d d的数加起来,对 m m m取余,现在要求将所有的数都变换 k k k次,得到的 n n n个数的值。
现在好了吧……
k
k
k太大了……并且有递推关系,于是矩阵快速幂。
矩阵快速幂是
O
(
n
3
log
2
k
)
O(n^3\log_2k)
O(n3log2k)的啊过不去……
不过我们发现
base
\text{base}
base矩阵很特殊,第一行从
1
1
1到
d
+
1
d+1
d+1个数,第
n
−
d
+
1
n-d+1
n−d+1到第
n
n
n个数都是
1
1
1,第二行是第一行后移一位得到……
那么我们就可以只计算一行的情况,然后直接推下一行的情况……
然后就可以少一个
n
n
n,变成
O
(
n
2
log
2
k
)
O(n^2\log_2 k)
O(n2log2k)的。
这样就能过了,可是我们观察那个矩阵,貌似是个卷积形式……
然后推一推FFT,就可以优化到
O
(
n
log
2
n
log
2
k
)
O(n\log_2n\log_2k)
O(nlog2nlog2k)。
其实不优化也行……有些时候FFT比
n
2
n^2
n2要慢……
Code