T1:传球游戏
思考难度:提高?
代码难度:提高?
正解:矩阵快速幂
若令 f[i][j]为第 i次传传到第 j个人的方案数,易知 f[i][j]=f[i−1][j−1]+f[i−1][j+1]
但是直接这样递推 O(nm)会 TLE,于是想到用矩阵来加速递推。
可知初始矩阵中 ans[i][i]=1,递推矩阵中 a[0][n−1]=a[n−1][0]=1 a[i][i+1]=a[i][i−1]=1。进行快速幂即可,时间复杂度 O(n3×logm),时间、空间都不允许。
但是,我们通过观察发现,无论何时,矩阵都是循环的,即
A=⎝⎜⎜⎜⎜⎜⎛a1anan−1⋮a2a2a1an⋮a3a3a2a1⋮a4⋯⋯⋯⋯anan−1an−2⋮a1⎠⎟⎟⎟⎟⎟⎞
我们利用此性质。乘出矩阵的一行来,直接将其他的复制好,时间复杂度 O(n2×logm),时间复杂度符合要求,但空间超了。
于是我们将矩阵缩为一维,利用循环的性质来求值即可,空间复杂度将为 O(n),理论上可以通过本题,但还是TLE。(18.19点2500ms+)
再来观察矩阵,发现第一行是
a1a2a3⋯a⌊2n+1⌋−1a⌊2n+1⌋a⌊2n+1⌋−1⋯a3a2
(偶数自行脑补)
即对称,所以可以优化一半常数。
但还是TLE。。。(18.19点1500ms+)
我们继续优化,发现矩阵相乘时,若有0,直接跳过,又优化了一点。(18.19点950~1100ms)
考虑观察一行,发现计算每一个的时候有重复计算的,我们发现可以用左面对称和右面对称来计算,还要考虑n为奇数偶数情况,及i为奇数偶数情况,可优化一半常数(理论上)。
于是就可以700ms通过本题了。(无 O2O3)