POJ 3734 Blocks 矩阵快速幂
来源:互联网 发布:网络电视有马赛克 编辑:程序博客网 时间:2024/06/05 03:46
题意:给N个方块染色,每个方块可以染红蓝绿黄四种颜色,红色&&绿色方块数必须为偶数,求方案数(%10007)。
首先有DP方程:
所以有矩阵A:
{2,2,0}
{1,2,1}
{0,2,2}
答案即{1,0,0}*
直接乘是O(N*T),会超时,so 用一个快速幂优化即可~~~
#include <cstdio>#include <cstring>#define mod 10007using namespace std;int n,T;struct xx{ int a[3][3];}a,ans,tmp;xx mul(xx a,xx b){ xx tmp; memset(tmp.a,0,sizeof(tmp.a)); for (int i=0;i<3;++i) for (int j=0;j<3;++j) for (int k=0;k<3;++k) tmp.a[i][j]=(tmp.a[i][j]+a.a[i][k]*b.a[k][j])%mod; return tmp;}int qsm(int x){ if (x==0) return 0; memset(ans.a,0,sizeof(ans.a)); ans.a[0][0]=1; //a=(xx){{2,2,0},{1,2,1},{0,2,2}}; a.a[0][0]=2;a.a[0][1]=2;a.a[0][2]=0; a.a[1][0]=1;a.a[1][1]=2;a.a[1][2]=1; a.a[2][0]=0;a.a[2][1]=2;a.a[2][2]=2; xx tmp=a; x--; while (x) { if (x&1) tmp=mul(tmp,a); a=mul(a,a); x>>=1; } ans=mul(ans,tmp); return ans.a[0][0];}int main(){ scanf("%d",&T); while (T--) { scanf("%d",&n); printf("%d\n",qsm(n)); }}
0 0
- poj 3734 Blocks 【矩阵快速幂】
- POJ 3734 Blocks(矩阵快速幂)
- POJ 3734 Blocks(矩阵快速幂)
- 【POJ 3734 Blocks】+ 矩阵快速幂
- poj 3734 Blocks(矩阵快速幂)
- poj #3734 Blocks(矩阵快速幂)
- POJ 3734 Blocks 矩阵快速幂
- poj 3734 Blocks【矩阵快速幂染色】
- [POJ 3734] Blocks (矩阵快速幂、组合数学)
- poj 3734 Blocks(构造矩阵加快速幂)
- [POJ 3734] Blocks (矩阵快速幂、组合数学)
- POJ 3734 Blocks 线性递推 矩阵快速幂
- Poj 3734 Blocks【矩阵快速幂+递推】
- POJ 3734 Blocks(dp、矩阵快速幂)
- Poj 3734 Blocks【递推+矩阵快速幂】好题
- 【POJ 3734】Blocks(递推+矩阵快速幂)
- poj 3734 Blocks (递推,矩阵快速幂)
- 文章标题 POJ 3734 : Blocks (矩阵快速幂)
- UCOS-II学习笔记
- 点击链接,弹出最大化窗口可能水平和垂直方向都居中的小窗口
- 飞得更高(四)皮包公司
- poj 1947 树形dp(求一颗树最少经过几次剪枝,可以得到特定大小的子树)
- C# 预处理器指令
- POJ 3734 Blocks 矩阵快速幂
- C# 正则表达式
- C# 异常处理
- Boost asio.
- C# 文件的输入与输出
- Github全面详解-10 Markdown学习
- <模型汇总_3>深度学习中最贪玩的模型dual-learning NMT
- Fighting for HDU
- 编辑利器——Vim