Topcoder口胡记 SRM 541 Div 1 ~ ?

据说做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 

___

留坑代填

猜你喜欢

转载自www.cnblogs.com/Blog-of-Eden/p/9747507.html
今日推荐