题意:

有长度为n的一排格子,每个格子里面可以任意填入1,2,3,4四个数字,问1,2都为偶数个的方案

T组数据,每组数据一个n(<=1e9)

样例输入

2

1

2

样例输出

2

6

分析

设dp[i][0/1/2/3]分别为处理到第i个,1和2的个数分别为 全偶、1偶2奇、1奇2偶,全奇

那么dp转移方程为

dp[i][0]=2dp[i-1][0]+dp[i-1][1]+dp[i-1][2] 填的分别是 3/4 1 2

dp[i][1]=dp[i-1][0]+2dp[i-1][1]+dp[i-1][3] 填的分别是 2 3/4 1

dp[i][2]=dp[i-1][0]+2dp[i-1][2]+dp[i-1][3] 填的分别是 1 3/4 2

dp[i][3]=dp[i-1][1]+dp[i-1][2]+2dp[i-1][3] 填的分别是 1 2 3/4

我们发现dp[i][1]和dp[i][2]可以合并在一起

那么将dp[i][1]和dp[i][2]合并为dp[i][1],dp[i][3]改为dp[i][2]

那么dp转移方程简化为:(简化方式为上面2式和3式相加,dp[i][1]和dp[i][2]替换为dp[i][1],dp[i][3]替换为dp[i][2])

dp[i][0]=2dp[i-1][0]+dp[i-1][1]

dp[i][1]=2dp[i-1][0]+2dp[i-1][1]+2dp[i-1][3]

dp[i][2]=dp[i-1][1]+2dp[i-1][2]

我们发现n=1e9直接推会T,所以就上矩阵快速幂,初始矩阵为

| 2 2 0 |

| 0 0 0 |

| 0 0 0 |

转置矩阵为

| 2 2 0 |

| 1 2 1 |

| 0 2 2 |

代码

 #include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define RG register int
#define rep(i,a,b) for(RG i=a;i<=b;++i)
#define per(i,a,b) for(RG i=a;i>=b;--i)
#define ll long long
#define inf (1<<29)
using namespace std;
ll T,n;
const ll mo=;
inline int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} struct Mat{
ll a[][];
Mat(){memset(a,,sizeof(a));}
inline ll * operator [] (const int x){return a[x];}
inline Mat operator *(Mat b)
{
Mat ans;
rep(i,,) rep(j,,) rep(k,,)
(ans[i][j]+=(a[i][k]*b[k][j]))%=mo;
return ans;
}
}; void work()
{
Mat S,T;
S[][]=,S[][]=,S[][]=,
T[][]=,T[][]=,
T[][]=,T[][]=,T[][]=,
T[][]=,T[][]=;
while(n)
{
if(n&)S=S*T;
T=T*T;
n>>=;
}
printf("%lld\n",S[][]);
} int main()
{
T=read();
while(T--)
{
n=read();
work();
}
return ;
}

Blocks [POJ3734] [矩阵快速幂]的更多相关文章

  1. POJ 3734 Blocks (矩阵快速幂)

    题目链接 Description Panda has received an assignment of painting a line of blocks. Since Panda is such ...

  2. POJ 3734 Blocks(矩阵快速幂+矩阵递推式)

    题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数. 该题我们可以想到一个递推式 .   设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数 ...

  3. POJ3734(矩阵快速幂)

    \(假设现在到第i个积木\) \(红绿恰都是偶数a种方案,恰都是奇数为b种方案,一奇一偶为c种方案\) \(由此考虑i+1个积木的情况\) Ⅰ.一奇一偶的方案 \(如果第i层恰是奇数的情况,那么本次只 ...

  4. poj3734矩阵快速幂

    挑战上面的题目,感觉脑洞很大 分别找红蓝个数全为偶,全为奇,一奇一偶的个数ai,bi,ci 转移矩阵是| 2 1 0 |,是一个对称矩阵(会不会有什么联系.) | 2 2 2 | | 0 1 2 | ...

  5. Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】

    题意: 有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k. 分 ...

  6. 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)

    题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...

  7. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...

  8. 51nod 1113 矩阵快速幂

    题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...

  9. 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

    还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...

随机推荐

  1. nautilus-open-terminal----在当前目录下打开终端

    nautilus-open-terminal很有用的插件--鼠标右键打开终端 1.1 fedora安装 # yum -y install nautilus-open-terminal安装nautilu ...

  2. seajs使用方法

    必须执行seajs.use()时,才能自动执行预加载项 <script src="/UILib/sea.js"></script> <script s ...

  3. windows service创建使用整合

    C#创建Windows Service(Windows 服务)基础教程 C#winform windows服务程序创建与安装 C#实现WinForm随WINDOWS服务一起启动

  4. springboot格式化时间

    使用@RestController注解,返回的java对象中若含有date类型的属性,则默认输出为TIMESTAMP时间戳格式,可以在配置文件加入下面配置 spring.jackson.date-fo ...

  5. 一个账户接管几乎所有阿里巴巴网站(CSRF漏洞+WAF绕过)

    场景 文章是关于某些客户端漏洞导致几个阿里巴巴网站的帐户被接管. 条件 TL;DR 必要条件,例如JSONP,某些浏览器处理cookie等行为. 攻击原理 大多数阿里巴巴的网站加载并执行外部JavaS ...

  6. C++多态、虚函数、纯虚函数、抽象类、虚基类

    一.C++多态 C++的多态包括静态多态和动态多态.静态多态包括函数重载和泛型编程,动态多态包括虚函数.静态多态是指在编译期间就可以确定,动态多态是指在程序运行时才能确定. 二.虚函数 1.虚函数为类 ...

  7. 如何用java实现一个p2p种子搜索(2)-路由表实现

    路由表实现 回顾一下上一篇讲的内容,上一篇提到从dht网络中获取infohash,那么加入dht网络后的最重要的第一步就是怎么去建立路由表. 路由表里面保存的是dht中其他node的信息,所以node ...

  8. sqlite3 学习

    安装sqlite: [ sqlite]$ wget http://www.sqlite.org/sqlite-3.6.16.tar.gz[ sqlite]$ tar -xzvf sqlite-3.6. ...

  9. 设计模式 — 简单工厂模式(staticFactory)

    这篇博文介绍简单工厂模式,设计模式并不是固定的二十三种,不同的书介绍的可能有出入,这篇介绍的简单工厂模式在有些书上就忽略不介绍了.设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验 ...

  10. memset函数的实现&printf函数几种输出格式的输出结果

    #include<stdio.h> #include<stdlib.h> void *memmset(void *dest, int ch, int count){ void ...