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

N个方块排成一列 用红,蓝,绿,黄4种颜色去涂色,求红色方块 和绿色方块个数同时为偶数的 方案数 对10007取余

Sample Input

2
1
2
Sample Output

2//(蓝,黄)
6//(红红,蓝蓝,蓝黄,绿绿,黄蓝,黄黄)

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 # include <map>
 6 # include <cmath>
 7 # define LL long long
 8 using namespace std ;
 9
10 const int MOD = 10007 ;
11
12 struct Matrix
13 {
14     LL mat[3][3];
15 };
16
17 Matrix mul(Matrix a,Matrix b) //矩阵乘法
18 {
19     Matrix c;
20     for(int i=0;i<3;i++)
21         for(int j=0;j<3;j++)
22         {
23             c.mat[i][j]=0;
24             for(int k=0;k<3;k++)
25             {
26                 c.mat[i][j]=(c.mat[i][j] + a.mat[i][k]*b.mat[k][j])%MOD;
27             }
28         }
29     return c;
30 }
31 Matrix pow_M(Matrix a,int k)  //矩阵快速幂
32 {
33     Matrix ans;
34     memset(ans.mat,0,sizeof(ans.mat));
35     for (int i=0;i<3;i++)
36         ans.mat[i][i]=1;
37     Matrix temp=a;
38     while(k)
39     {
40         if(k&1)ans=mul(ans,temp);
41         temp=mul(temp,temp);
42         k>>=1;
43     }
44     return ans;
45 }
46
47
48
49 int main ()
50 {
51    // freopen("in.txt","r",stdin) ;
52     int T;
53     cin>>T ;
54     Matrix t ;
55     t.mat[0][0] = 2 ; t.mat[0][1] = 1 ; t.mat[0][2] = 0 ;
56     t.mat[1][0] = 2 ; t.mat[1][1] = 2 ; t.mat[1][2] = 2 ;
57     t.mat[2][0] = 0 ; t.mat[2][1] = 1 ; t.mat[2][2] = 2 ;
58     while(T--)
59     {
60         int n ;
61         cin>>n ;
62         Matrix ans = pow_M(t,n) ;
63         cout<<ans.mat[0][0]%MOD<<endl ;
64
65     }
66
67
68     return 0 ;
69 }

时间: 2024-11-06 20:48:12

poj 3734 方块涂色 求红色 绿色方块都为偶数的方案数 (矩阵快速幂)的相关文章

poj 3734 矩阵快速幂+YY

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

poj 3070 Fibonacci 【矩阵快速幂 求第N个斐波那契数%1000】

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11123   Accepted: 7913 Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn ? 1 + Fn ? 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequenc

POJ 2778 DNA Sequence(AC自动机确定DFA转移图+矩阵快速幂)

这道题极好的展示了AC自动机在构造转移图DFA上的应用 DFA转移图就是展示状态的转移过程的图,DFA图构造出来后就可以用DP求出任何DNA长度下,任何状态的个数 本题用自动机求出DFA矩阵,那么有 | dp[n][0] dp[n][1] ... dp[n][m] |=|dp[1][0] dp[1][1] ... dp[1][m] | * DFA^(n-1)    (m指状态总数) DP边界矩阵|dp[1][0] dp[1][1] ... dp[1][m] | 也就是DFA的第一行,所以dp[n

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

Blocks Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3997   Accepted: 1775 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 paint

POJ 3734 Blocks (矩阵快速幂)

题目链接:http://poj.org/problem?id=3734 <挑战程序设计竞赛>202页.与单纯的用递推式与矩阵快速幂求第N项不同,设染到第i个方块为止,红绿都是偶数的方案数目为a,红绿恰有一个是偶数方案数目为b,红绿都是奇数方案数目为c, 则: a[i+1] = 2 * a[i] + b[i] b[i+1] = 2 * a[i]+2 * b[i]+2 * c[i] c[i+1] = b[i] + 2 * c[i] 之后构建3*3矩阵求解 代码: 1 typedef vector&

POJ 3734 Blocks(矩阵快速幂加递推)

Blocks Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6133   Accepted: 2931 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 paint

POJ 3070-Fibonacci(矩阵快速幂求斐波那契数列)

Fibonacci Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3070 Appoint description:  System Crawler  (2015-02-28) Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn ? 1 +

poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项)

题意就是用矩阵乘法来求斐波那契数列的第n项的后四位数.如果后四位全为0,则输出0,否则 输出后四位去掉前导0,也...就...是...说...输出Fn%10000. 题目说的如此清楚..我居然还在%和/来找后四位还判断是不是全为0还输出时判断是否为0然后 去掉前导0.o(╯□╰)o 还有矩阵快速幂的幂是0时要特判. P.S:今天下午就想好今天学一下矩阵乘法方面的知识,这题是我的第一道正式接触矩阵乘法的题,欧耶! #include<cstdio> #include<iostream>

POJ 3233-Matrix Power Series(矩阵快速幂+二分求矩阵和)

Matrix Power Series Time Limit:3000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3233 Appoint description:  System Crawler  (2015-02-28) Description Given a n × n matrix A and a positive integer k, find the