【POJ 3734】【用母函数推公式 或者 矩阵幂】 Blocks【现要给n块砖染红、蓝、绿、黄四种颜色。要求被染成红色和绿色的砖块数量必须为偶数,问染色方案数】
来源:互联网 发布:c程序员桌面壁纸高清 编辑:程序博客网 时间:2024/05/17 22:41
传送门:http://poj.org/problem?id=3734
描述:
Description
Panda has received an assignment of painting a line of blocks. Since Panda is such an intelligent boy, he starts to think of a math problem of painting. Suppose there are N blocks in a line and each block can be paint red, blue, green or yellow. For some myterious reasons, Panda want both the number of red blocks and green blocks to be even numbers. Under such conditions, Panda wants to know the number of different ways to paint these blocks.
Input
The first line of the input contains an integer T(1≤T≤100), the number of test cases. Each of the next T lines contains an integer N(1≤N≤10^9) indicating the number of blocks.
Output
For each test cases, output the number of ways to paint the blocks in a single line. Since the answer may be quite large, you have to module it by 10007.
Sample Input
212
Sample Output
26
Source
题意:
有一排砖,数量为N。现要将砖全部染上色,有红、蓝、绿、黄四种颜色。要求被染成红色和绿色的砖块数量必须为偶数,问一共有多少种染色方案。(由于答案较大,模10007)
思路一:
挑战书上P202
分别列出三个递推式就好了
代码一:
#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <vector>using namespace std;typedef long long ll;typedef vector<int>vec;typedef vector<vec>mat;const int M=10007;//计算A*Bmat mul(mat& A,mat& B){ mat C(A.size(),vec(B[0].size())); for(int i=0 ; i<A.size() ; i++){ for(int k=0 ; k<B.size() ; k++){ for(int j=0 ; j<B[0].size() ; j++){ C[i][j]=(C[i][j]+A[i][k]*B[k][j])%M; } } } return C;}//计算A^nmat pow(mat A , ll n){ mat B(A.size(),vec(A.size())); for(int i=0 ; i<A.size() ; i++){ B[i][i]=1; } while(n>0){ if(n&1)B=mul(B,A); A=mul(A,A); n>>=1; } return B;}ll n;void solve(){ mat A(3,vec(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; A=pow(A,n); printf("%d\n",A[0][0]);}int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d",&n); solve(); } return 0;}
代码二:
#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define mod 10007int n;int pow_mod(int x, int n){ int res = 1; while(n){ if(n & 1) res = res * x % mod; x = x * x % mod; n >>= 1; } return res;}int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d",&n); printf("%d\n", (pow_mod(4, n - 1) + pow_mod(2, n - 1)) % mod); } return 0;}
- 【POJ 3734】【用母函数推公式 或者 矩阵幂】 Blocks【现要给n块砖染红、蓝、绿、黄四种颜色。要求被染成红色和绿色的砖块数量必须为偶数,问染色方案数】
- POJ 3734 Blocks【用母函数推公式|矩阵乘法】
- poj 3734 Blocks【矩阵快速幂染色】
- 202——砖块染色问题 Blocks (POJ 3734)
- 颜色以红色、品红、蓝紫色、绿/黄、蓝、桔红和青色排序
- 红绿黄染色,红绿个数为偶数
- POJ 3734 Blocks 线性递推 矩阵快速幂
- Poj 3734 Blocks【矩阵快速幂+递推】
- Poj 3734 Blocks【递推+矩阵快速幂】好题
- 【POJ 3734】Blocks(递推+矩阵快速幂)
- poj 3734 Blocks (递推,矩阵快速幂)
- poj 3734 Blocks 递推+矩阵幂优化
- Blocks - POJ 3734 矩阵乘法递推
- POJ 3734 Blocks (矩阵的幂)
- poj-3734Blocks[矩阵的幂]
- 颜色特征识别—识别红色,黄色,绿色,蓝色排针的数量
- POJ 3734 Blocks 生成函数及矩阵的解法
- poj-2140-Herd Sums- 数学规律-连续和为N的方案数
- [JAVA]动态规划-求三角矩阵的最佳路径
- CSS中选择器优先级
- php源码之路第三章第五节( 类型提示的实现)
- 在OL7上修改网卡名称
- iOS 开发APP更换用户头像问题的处理方式
- 【POJ 3734】【用母函数推公式 或者 矩阵幂】 Blocks【现要给n块砖染红、蓝、绿、黄四种颜色。要求被染成红色和绿色的砖块数量必须为偶数,问染色方案数】
- ubuntu adobe flash player已过期
- Xilinx SelectIO 接口
- 谷歌技术"三宝"之MapReduce
- 100道动态规划——3 UVA 2451 Brackets sequence 重构解 DP
- 到底如何理解递归?
- JavaScript中统计字符的个数
- OL7中网卡的命名方法
- STC单片机控制PCA9554A程序