zoukankan      html  css  js  c++  java
  • 数论出题组比赛用题:传球游戏

    T1:传球游戏

    思考难度:提高?

    代码难度:提高?

    正解:矩阵快速幂

    若令f[i][j]f[i][j]为第ii次传传到第jj个人的方案数,易知f[i][j]=f[i1][j1]+f[i1][j+1]f[i][j]=f[i-1][j-1]+f[i-1][j+1]

    但是直接这样递推O(nm)O(nm)TLETLE,于是想到用矩阵来加速递推。

    可知初始矩阵中ans[i][i]=1ans[i][i]=1,递推矩阵中a[0][n1]=a[n1][0]=1a[0][n-1]=a[n-1][0]=1 a[i][i+1]=a[i][i1]=1a[i][i+1]=a[i][i-1]=1。进行快速幂即可,时间复杂度O(n3×log m)O(n^3 imes log:m),时间、空间都不允许。

    但是,我们通过观察发现,无论何时,矩阵都是循环的,即
    A=(a1a2a3anana1a2an1an1ana1an2a2a3a4a1)A=egin{pmatrix} a_1 & a_2 & a_3 & cdots & a_n \ a_n & a_1 & a_2 & cdots & a_{n-1} \ a_{n-1} & a_n & a_1 & cdots & a_{n-2} \ vdots & vdots & vdots & & vdots \ a_2 & a_3 & a_4 & cdots & a_1 \ end{pmatrix}

    我们利用此性质。乘出矩阵的一行来,直接将其他的复制好,时间复杂度O(n2×log m)O(n^2 imes log:m),时间复杂度符合要求,但空间超了。

    于是我们将矩阵缩为一维,利用循环的性质来求值即可,空间复杂度将为O(n)O(n),理论上可以通过本题,但还是TLE。(18.19点2500ms+)

    再来观察矩阵,发现第一行是

    a1    a2    a3        an+121    an+12    an+121        a3    a2a_1;;a_2;;a_3;;cdots;;a_{lfloor{frac{n+1}{2} floor}-1};;a_{lfloor{frac{n+1}{2} floor}};;a_{lfloor{frac{n+1}{2} floor}-1};;cdots;;a_3;;a_2

    (偶数自行脑补)

    即对称,所以可以优化一半常数。

    但还是TLE。。。(18.19点1500ms+)

    我们继续优化,发现矩阵相乘时,若有0,直接跳过,又优化了一点。(18.19点950~1100ms)

    考虑观察一行,发现计算每一个的时候有重复计算的,我们发现可以用左面对称和右面对称来计算,还要考虑n为奇数偶数情况,及i为奇数偶数情况,可优化一半常数(理论上)。

    于是就可以700ms通过本题了。(无O2    O3O_2;;O_3)

  • 相关阅读:
    HDU 1009 FatMouse' Trade
    HDU 2602 (简单的01背包) Bone Collector
    LA 3902 Network
    HDU 4513 吉哥系列故事——完美队形II
    LA 4794 Sharing Chocolate
    POJ (Manacher) Palindrome
    HDU 3294 (Manacher) Girls' research
    HDU 3068 (Manacher) 最长回文
    Tyvj 1085 派对
    Tyvj 1030 乳草的入侵
  • 原文地址:https://www.cnblogs.com/vercont/p/10210014.html
Copyright © 2011-2022 走看看