2010-1155

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

先简述一下题意:
      有n*m的格子矩阵,n,m不超过8,刚开始是没有石子的,每个格子有一串操作,操作的长度不超过6,全部格子同时进行操作,每秒一个进行操作,每个格子做完最后一个操作,下一个操作为第一个,一直循环下去,直到时间t秒。操作可能是放一些石头进该格子;把该格子的石子移到紧贴的四个格子之一;把该格子清空。求时间t时全部格子里石子数最多的格子的石子数。

比较正统的解法:
      因为操作长度不超过6,所以经过一定时间后,所有操作都会同时回到第一个,这个时间的最小值就是他们的最小公倍数,设为P。
      这样我们可以先做P秒,用模拟就好了,因为P很小;然后每次都做P秒,这个可以用logN的矩阵乘法。

很快捷的解法:
      这些格子进行的这些操作,可以发现每个格子的石子数经过一个周期增加的是一个常量,这样可以先模拟两个周期,算出每个格子的增量,然后等差数列求和。

先简述一下题意:

有n*m的格子矩阵,n,m不超过8,刚开始是没有石子的,每个格子有一串操作,操作的长度不超过6,全部格子同时进行操作,每秒一个进行操作,每个格子做完最后一个操作,下一个操作为第一个,一直循环下去,直到时间t秒。操作可能是放一些石头进该格子;把该格子的石子移到紧贴的四个格子之一;把该格子清空。求时间t时全部格子里石子数最多的格子的石子数。

比较正统的解法:

因为操作长度不超过6,所以经过一定时间后,所有操作都会同时回到第一个,这个时间的最小值就是他们的最小公倍数,设为P。

这样我们可以先做P秒,用模拟就好了,因为P很小;然后每次都做P秒,这个可以用logN的矩阵乘法。

很快捷的解法:

这些格子进行的这些操作,可以发现每个格子的石子数经过一个周期增加的是一个常量,这样可以先模拟两个周期,算出每个格子的增量,然后等差数列求和。