矩阵快速幂+递推

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

^_^

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

相关文章推荐

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

Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total...

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

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

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

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

hdu2604(递推,矩阵快速幂)

题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(P...

HDU 2604 递推 + 矩阵快速幂

HDU 2604 题解:首先, 记长为n的队列的K队列数为f(n); 易求得:f(0) = 0, f(1) = 2, f(2) =  4, f(3) = 6, f(4) =...
  • ADjky
  • ADjky
  • 2016-10-06 18:37
  • 127

HDU4565-So easy-数学推导化简递推矩阵快速幂

So Easy! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S...

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

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

递推+矩阵快速幂

由于长度为一的方块只有一种方案,长度为二的有四种方案(不包含长度为一中的情况),长度为三的有两种方案(不包含长度为二中的情况),得递推式: f[i] = f[i-1] + f[i-2] * ...

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

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

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

The Active Leyni Time Limit: 1000 MS Memory Limit: 65536 K   Total Submit: 111(43 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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