题目的大意:

给定待粉刷的n个墙砖(排成一行),每一个墙砖能够粉刷的颜色种类为:红、蓝、绿、黄,

问粉刷完成后,红色墙砖和蓝色墙砖都是偶数的粉刷方式有多少种(结果对10007取余).

解题思路:

思路用的是递推.如果粉刷到第i个墙砖时,使用的红色墙砖和蓝色墙砖都是偶数的方案

数有ai,使用的红色和蓝色墙砖一奇一偶的方案数为bi,使用的红色和蓝色墙砖都是奇数的

方案数为ci,那么,我们easy得到以下的递推式:

看到上式,对于学过线代的人来说一定不陌生,我们能够将其写成矩阵的形式,然后会发现该

递推式是等比数列的形式.

对于求取ai,我们可通过计算对应矩阵的幂得知,计算矩阵的幂,利用高速二分幂,

可将时间复杂度降为O(lgn).

解题代码:

#include<vector>
#include<iostream>
#include<algorithm>
#define M 10007
using namespace std;
//矩阵乘法
vector<vector<int> > multi(vector<vector<int> > &A, vector<vector<int> > &B)
{
vector<vector<int> > C(A.size(), vector<int>(B[0].size()));
for (unsigned i = 0; i != A.size(); ++i)
for (unsigned j = 0; j != B[0].size(); ++j)
for (unsigned k = 0; k != B.size(); ++k)
C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % M;
return C;
}
//二分高速幂
vector<vector<int> > power(vector<vector<int> > &A, int n)
{
vector<vector<int> > B(A.size(), vector<int>(A.size()));
for (int i = 0; i != A.size(); ++i)
B[i][i] = 1;
while (n)
{
if (n & 1)
B = multi(B, A);
A = multi(A, A), n >>= 1;
}
return B;
}
int main()
{
int t,n;
cin >> t;
while (t--)
{
vector<vector<int> > A(3, vector<int>(3));
A[0][0] = 2, A[0][1] = 1, A[0][2] = 0;
A[1][0] = 2, A[1][1] = 2, A[1][2] = 2;
A[2][0] = 0, A[2][1] = 1, A[2][2] = 2;
cin >> n;
A = power(A, n);
cout << A[0][0] << endl;
}
return 0;
}

POJ 3734的更多相关文章

  1. [POJ 3734] Blocks (矩阵高速幂、组合数学)

    Blocks Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3997   Accepted: 1775 Descriptio ...

  2. poj 3734 Blocks

    ゲート 分析:这题过的人好多,然后大家好像是用矩阵过的(((φ(◎ロ◎;)φ))).我自己是推公式的. 对于任意的有这个式子, 就是先从里面选偶数个涂成两个指定的颜色,再在选出的里面选定涂某种颜色,选 ...

  3. poj 3734 Blocks 快速幂+费马小定理+组合数学

    题目链接 题意:有一排砖,可以染红蓝绿黄四种不同的颜色,要求红和绿两种颜色砖的个数都是偶数,问一共有多少种方案,结果对10007取余. 题解:刚看这道题第一感觉是组合数学,正向推了一会还没等推出来队友 ...

  4. poj 3734 矩阵快速幂+YY

    题目原意:N个方块排成一列,每个方块可涂成红.蓝.绿.黄.问红方块和绿方块都是偶数的方案的个数. sol:找规律列递推式+矩阵快速幂 设已经染完了i个方块将要染第i+1个方块. a[i]=1-i方块中 ...

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

    Blocks Input The first line of the input contains an integer T(1≤T≤100), the number of test cases. E ...

  6. poj 3734 方块涂色 求红色 绿色方块都为偶数的方案数 (矩阵快速幂)

    N个方块排成一列 用红,蓝,绿,黄4种颜色去涂色,求红色方块 和绿色方块个数同时为偶数的 方案数 对10007取余 Sample Input 212Sample Output 2//(蓝,黄)6//( ...

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

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

  8. POJ 3734 生成函数

    题意:一排n长度的砖,有四种颜色,红色绿色是偶数,有少染色方式. 分析: 泰勒展开式: chx = (e^x+e^(-x))/2 = 1 + x^2/2! + x^4/4! + x^6/6! + .. ...

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

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

随机推荐

  1. 基于u-boot源码的简单shell软件实现

    一.概述 1.shell概念 Shell(命令解析器),它用于接收用户输入的命令,进行解析,然后调用相应的应用程序,为使用者提供了使用软件的界面. shell是操作系统最外面的一层.shell管理你与 ...

  2. C语言中调用Lua

    C语言和Lua天生有两大隔阂: 一.C语言是静态数据类型,Lua是动态数据类型 二.C语言需要程序员管理内存,Lua自动管理内存 为了跨越世俗走到一起,肯定需要解决方案. 解决第一点看上去比较容易,C ...

  3. Js 中json简单处理

    Json2.js下载地址 json常用处理 Json字符串 var str = '{"code":10,"msg":"codemsg",&q ...

  4. angularJS vs backbone

    http://alistapart.com/article/javascript-mvc http://blog.nebithi.com/backbone-and-angular-demystifyi ...

  5. WebApp触屏版网站开发要点

    所谓的触屏版网站其实也是WebApp的一种展示形式,主要是依赖HTML+CSS+Javascript这三个关键因素来实现,相比较原生客户端程序来说优点就是开发周期短.升级简单.维护成本低,因为从根本上 ...

  6. JavaSE 国际化 简单例子

    ①在src下添加两个文件: base_zh_CN.properties Test=\u8fd9\u662f\u4e2d\u6587 base_en_US.properties Test=english ...

  7. 【POJ 3162】 Walking Race (树形DP-求树上最长路径问题,+单调队列)

    Walking Race   Description flymouse's sister wc is very capable at sports and her favorite event is ...

  8. 【HDU 3709】 Balanced Number (数位DP)

    Balanced Number Problem Description A balanced number is a non-negative integer that can be balanced ...

  9. UVA 1513 Movie collection

    #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 200010 #define l ...

  10. [topcoder]ActivateGame

    http://community.topcoder.com/stat?c=problem_statement&pm=10750&rd=14153 http://apps.topcode ...