矩阵快速幂+递推

原创 2016年08月28日 21:03:02


由题意易得递推式:
f[i]=f[i-1]+f[i-2]*4+f[i-3]*2
其中长度为1的消除方法只有一种,长度为2的消除方法是4种(不包括与长度为1重复的一种),长度为三的消除方法一共有2种。
注意,f[0]=1。
但由于数据量巨大!!!(giant)我们想到了矩阵快速幂的优化。
下面一起来推一推:
用类似fibonacci矩阵乘法的方法,这里用到了一个3*3的矩阵。
首先答案矩阵是:
{f[i]
f[i+1]
f[i+2]}
要将它变成矩阵:
{f[i+1]
f[i+2]
f[i+3]}
只需用计算矩阵:
{0 1 0
0 0 1
2 4 1} 乘上 答案矩阵 即可。
所以只需要将计算矩阵自乘n-3次,再将得到的矩阵第三行相加即使答案。代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long LL;
const int mod=1000000007;
LL n;
struct node{
    LL g[4][4];
    void init(){
        g[1][1]=g[1][3]=g[2][1]=g[2][2]=0;
        g[1][2]=g[2][3]=1;g[3][1]=2;
        g[3][2]=4;g[3][3]=1;
    }
};
node operator *(node A,node B){
    node ret;
    memset(ret.g,0,sizeof(ret.g));
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
            for(int k=1;k<=3;k++)
                ret.g[i][j]=(ret.g[i][j]+(A.g[i][k]*B.g[k][j])%mod)%mod;
    return ret;
}
node pow(node a,LL b){
    bool flag=false;
    node ans;
    while(b){
        if(b&1LL){
            if(!flag) ans=a;
            else ans=ans*a;
            flag=true;
        }
        a=a*a;
        b>>=1;
    }
    return ans;
}
int main(){
    scanf("%lld",&n);
    if(n==0) printf("1");
    else if(n==1) printf("1");
    else if(n==2) printf("5");
    else if(n==3) printf("11");
    else{
        node a;
        a.init();
        a=pow(a,n-3);
        printf("%lld",(a.g[3][1]*1+a.g[3][2]*5+a.g[3][3]*11)%mod);
    }
    return 0;
}

^_^

版权声明:本文为博主原创文章,未经博主允许不得转载。

矩阵快速幂 ——(递推表达式)

矩阵快速幂    首先知道矩阵       矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合;      矩阵乘法: 定义:设A为    的矩阵,B为    的矩阵,那么称    的矩阵...
  • WR_technology
  • WR_technology
  • 2016年05月06日 19:44
  • 1434

矩阵快速幂优化递推式 例:斐波那契数列

矩阵快速幂优化递推式
  • G_congratulation
  • G_congratulation
  • 2016年10月04日 16:52
  • 4667

NYOJ 1075 (递推 + 矩阵快速幂)

“红色病毒”问题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 医学研究者最近发现了一种新病毒,因为其蔓延速度与曾经在Internet上传播的“红色代码”不相上下,故被...
  • LYHVOYAGE
  • LYHVOYAGE
  • 2014年09月29日 08:03
  • 1400

矩阵快速幂与递推式

矩阵快速幂 递推式
  • ACTerminate
  • ACTerminate
  • 2016年10月31日 19:13
  • 525

矩阵快速幂+高斯消元解递推方程-HDU6185

http://acm.hdu.edu.cn/showproblem.php?pid=6185题目描述Bob’s school has a big playground, boys and girls ...
  • d12155214552
  • d12155214552
  • 2017年08月31日 19:16
  • 787

NYOJ 301 递推求值(矩阵快速幂)

递推求值 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的...
  • LYHVOYAGE
  • LYHVOYAGE
  • 2014年04月04日 12:25
  • 3197

递推+矩阵快速幂

由于长度为一的方块只有一种方案,长度为二的有四种方案(不包含长度为一中的情况),长度为三的有两种方案(不包含长度为二中的情况),得递推式: f[i] = f[i-1] + f[i-2] * ...
  • dy0607
  • dy0607
  • 2016年08月28日 20:54
  • 241

矩阵快速幂(总结)

转载自:点击打开链接 基础知识:(会基础的直接看应用部分) (1)矩阵乘法 简单的说矩阵就是二维数组,数存在里面,矩阵乘法的规则:A*B=C 其中c[i][j]为A的第i行与B的第...
  • Aiwen1413
  • Aiwen1413
  • 2016年12月03日 15:41
  • 310

矩阵快速幂算法+例题(HDU 5667 Sequence)

矩阵快速幂是ACM比赛中对于求递推式能用到的模板,能实现O(N^3*logM)的复杂度,其中 N是矩阵阶乘,M是要求的第几项。对于矩阵快速幂,首先的得知道单位矩阵 ⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪11⋮1...
  • o670783915
  • o670783915
  • 2016年04月30日 15:55
  • 1234

POJ3070矩阵快速幂求Fib

欲哭无泪。。。。。比赛的时候都敲不出来。。 Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Tota...
  • u012350533
  • u012350533
  • 2013年10月08日 23:50
  • 954
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:矩阵快速幂+递推
举报原因:
原因补充:

(最多只允许输入30个字)