[FFT] [矩阵快速幂] [POJ3150] Cellular Automaton

题目传送门
(POJ原地址,如果上不去请看这里
还是翻译:
题目描述 Description

细胞自动机是处在一个特定形状网格上的一组细胞,这些细胞按照一组基于相邻细胞的状态描述新状态的规则通过一系列离散的时间进化。细胞自动机的顺序是它包含的细胞数量。一个顺序为n 的细胞自动机中的细胞编号为1 ~n
细胞的顺序是它可能包含的不同价值数。通常情况下,顺序为m 的细胞的价值为0 ~m1 的整数。
细胞自动机的基本特性之一是它进行计算时网格的类型。在这个问题中我们考虑一种特殊形状的细胞自动机——环状细胞自动机。这种自动机有n 个细胞,每个细胞有m 种价值。我们把这种细胞自动机表示为n,m ——自动机。
n,m ——自动机里,i 细胞与j 细胞的距离被定义为min(|ij|,n|ij|) 。一个d ——环境细胞指的是与这个细胞的距离不大于d 的细胞集合。
d 步之内的细胞价值会被新价值统一取代。在d 步后细胞i 的新价值计算为属于这个细胞的d ——环境内所有细胞的价值对m 取模。
下面这张图片显示了5,3 ——自动机进行1 步操作。
问题是计算n,m ——自动机进行了kd 步操作之后的状态。

输入 Input

第一行包含了4 个整数为n,m,d,k1n500,1m106,0d<n2,1k107 。第二行包含n 个从0m1 的整数,表示自动机内细胞的初始价值。

输出 Output

输出n,m ——自动机进行了kd 步操作之后的状态。

还是没看懂?

n 个数围成一个环,现在有一种变换,将所有距离第i(1in) 个数小于等于d 的数加起来,对m 取余,现在要求将所有的数都变换k 次,得到的n 个数的值。

现在好了吧……
k 太大了……并且有递推关系,于是矩阵快速幂。
矩阵快速幂是O(n3log2k) 的啊过不去……
不过我们发现base 矩阵很特殊,第一行从1d+1 个数,第nd+1 到第n 个数都是1 ,第二行是第一行后移一位得到……
那么我们就可以只计算一行的情况,然后直接推下一行的情况……
然后就可以少一个n ,变成O(n2log2k) 的。
这样就能过了,可是我们观察那个矩阵,貌似是个卷积形式……
然后推一推FFT,就可以优化到O(nlog2nlog2k)
其实不优化也行……有些时候FFT比n2 要慢……
Code

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章