据说做TC题有助于提高知识水平? :)
传送门:https://284914869.github.io/AEoj/index.html
转载请注明链接:https://www.cnblogs.com/Blog-of-Eden/p/9747507.html
Topcoder SRM 541 Div 1 - Problem 1000 XorLife
好久没做TC题了。。被一道趣题难倒o(╥﹏╥)o
设 trans(t) 为,初始位置 t 秒钟之后方格状态贡献的向量集合。如trans(1)={(1,0),(0,1),(-1,0),(0,-1),(0,0)}。
容易证明 trans(2t) = { 2*a | a∈trans(t) }
设 F(S,t) 为,初始状态为S, 经过 t 秒钟后的状态。
当t为奇数时,把t转变为偶数递归,即 F(S,t)=F(S', t-1)
当t为偶数时,由于trans(2t)是将trans(t)中所有向量乘以2,
我们把状态S,按照行的奇偶性和列的奇偶性分离成四组:S1,S2,S3,S4。
每一组行和列靠拢,重新并成新的状态S1',S2',S3',S4',(此时状态的长和宽都除了2)
那么显然Count( trans( S1, 2t ) ) = Count( trans( S1', t) )
且由于这四组行或列的奇偶性不同,所以trans(Sx, 2t) 对于x=1,2,3,4 独立。
故Count(S, 2t) = Count(S1', t) + Count(S2', t) + Count(S3', t) + Count(S4', t) 又可递归求解
由于递归成四个分支时,状态面积缩小了四倍。时间复杂度十分可观。可以记忆化搜索。
题外话:当初始状态只有一个1的时候,在oeis上有相应的公式哦 http://oeis.org/A072272
___
留坑代填