POJ 3734
2014-10-24 21:47
211 查看
题目的大意:
给定待粉刷的n个墙砖(排成一行),每一个墙砖能够粉刷的颜色种类为:红、蓝、绿、黄,
问粉刷完成后,红色墙砖和蓝色墙砖都是偶数的粉刷方式有多少种(结果对10007取余).
解题思路:
思路用的是递推.如果粉刷到第i个墙砖时,使用的红色墙砖和蓝色墙砖都是偶数的方案
数有ai,使用的红色和蓝色墙砖一奇一偶的方案数为bi,使用的红色和蓝色墙砖都是奇数的
方案数为ci,那么,我们easy得到以下的递推式:
看到上式,对于学过线代的人来说一定不陌生,我们能够将其写成矩阵的形式,然后会发现该
递推式是等比数列的形式.
对于求取ai,我们可通过计算对应矩阵的幂得知,计算矩阵的幂,利用高速二分幂,
可将时间复杂度降为O(lgn).
解题代码:
给定待粉刷的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-Blocks
- POJ 3734
- POJ 3734-Blocks
- poj 3734 Blocks
- POJ 3734 wata 的快速幂 模板。
- poj 3734 Blocks【矩阵快速幂染色】
- poj 3734 Blocks (递推,矩阵快速幂)
- poj 3734 Blocks 递推+矩阵幂优化
- POJ-3734 Blocks
- poj 3734 Blocks(矩阵快速幂)
- Blocks(POJ 3734 矩阵快速幂)
- [POJ 3734] Blocks (矩阵快速幂、组合数学)
- POJ 3734 DP+矩阵乘法
- POJ_3734_Blocks_矩阵快速幂
- poj 3734 方块涂色 求红色 绿色方块都为偶数的方案数 (矩阵快速幂)
- poj 3734 矩阵快速幂、母函数
- poj 3734 Blocks 【矩阵快速幂】
- poj3734--blocks(矩阵快速幂)
- POJ 3734 Blocks 线性递推 矩阵快速幂
- poj 3734 矩阵快速幂模板清晰版