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)

  • 相关阅读:
    c语言 414 根据输入的整数,循环显示1234567890
    c语言 47 编写一段程序,显示小于输入的整数的所有2的乘方。
    c语言49 交替输出正负号,当输入0以下时什么也不显示
    c语言48 改写48的程序,当输入的值小于1时不输出换行符
    c语言 411 逆向输出输入的整数值(同时输出原始数据)
    c语言47 显示出小于输入的整数的所有2的乘方
    c语言412 输入一个整数值显示其位数
    c语言415 输出标准身高体重对照表
    c语言413 求1到n的和
    c语言 410 输出连续* \n
  • 原文地址:https://www.cnblogs.com/ShineEternal/p/10834256.html
Copyright © 2011-2022 走看看