矩阵快速幂+递推

原创 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;
}

^_^

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

51nod 1126 求递推序列的第N项 矩阵快速幂

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1126题意:有一个序列是这样定义的:f(1) = 1, f(2) =...

【POJ 3420】Quad Tiling(dp|递推 +矩阵快速幂)

秋意渐浓,阳光西斜,遍地金黄

递推+矩阵快速幂

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

【HDU5895 2016 ACM ICPC Asia Regional Shenyang Online D】【公式转化 矩阵快速幂 欧拉定义】Mathematician QSC 递推数列前n平方项和

Mathematician QSC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Oth...

hrbust 1375 The Active Leyni【暴力打表+递推+矩阵快速幂】

The Active Leyni Time Limit: 1000 MS Memory Limit: 65536 K   Total Submit: 111(43 ...

[HDU1588]Gauss Fibonacci(递推+矩阵快速幂)

不觉碧山暮,但闻万壑松。

HihoCoder1151 骨牌覆盖问题·二(矩阵快速幂,递推)

题目: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上一周我们研究了2xN的骨牌问题,这一周我们不妨加大一下难度,研究一下3...

HDU 2604 Queuing (递推+ 矩阵快速幂)

Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total...
  • sizaif
  • sizaif
  • 2017年08月10日 10:30
  • 105

【51Nod】1126 - 求递推数列的第N项(矩阵快速幂 & C++运算符重载)

题目链接:点击打开题目代码如下:#include #include #include #include #include #include #include using namespac...
  • wyg1997
  • wyg1997
  • 2017年03月04日 14:59
  • 222

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

“红色病毒”问题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 医学研究者最近发现了一种新病毒,因为其蔓延速度与曾经在Internet上传播的“红色代码”不相上下,故被...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:矩阵快速幂+递推
举报原因:
原因补充:

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