定义ai表示红色和绿色方块中方块数为偶数的颜色有i个,i = 0,1,2。

aij表示刷到第j个方块时的方案数,这是一个线性递推关系。

可以构造递推矩阵A,用矩阵快速幂求解。

 1 /*********************************************************
 2 *            ------------------                          *
 3 *   author AbyssalFish                                   *
 4 **********************************************************/
 5 #include<cstdio>
 6 #include<iostream>
 7 #include<string>
 8 #include<cstring>
 9 #include<queue>
10 #include<vector>
11 #include<stack>
12 #include<vector>
13 #include<map>
14 #include<set>
15 #include<algorithm>
16 #include<cmath>
17 using namespace std;
18
19 typedef long long ll;
20
21 #define PB push_back
22 const int maxn = 3, mod = 1e4+7;
23 const int n = 3;
24 typedef int MType;
25 typedef vector<MType> row;
26 typedef vector<row> mat;
27 struct Matrix
28 {
29     mat dat;
30     row &operator [](int x){ return dat[x]; }
31     Matrix operator * (Matrix& B) {
32         Matrix re;
33         re.dat.resize(n,row(3,0));
34         for(int i = 0; i < n; i++){
35             for(int j = 0; j < n; j++){
36                 for(int k = 0; k < n; k++){
37                     re[i][j] = (re[i][j]+dat[i][k]*B[k][j])%mod;
38                 }
39             }
40         }
41         return re;
42     }
43     Matrix operator ^ (int q){
44         Matrix Re, A = *this;
45         Re.dat.resize(n,row(3,0));
46         for(int i = 0; i < n; i++) {
47             Re[i][i] = 1;
48         }
49         while(q){
50             if(q&1){
51                 Re = Re * A;
52             }
53             A = A * A;
54             q >>= 1;
55         }
56         return Re;
57     }
58 };
59
60 //#define LOCAL
61 int main()
62 {
63 #ifdef LOCAL
64     freopen("in.txt","r",stdin);
65 #endif
66     Matrix A;
67     A.dat.resize(3,row(3,0));
68     A[0][0] = 2; A[0][1] = 1;
69     fill(A.dat[1].begin(),A.dat[1].end(),2);
70     A[2][1] = 1; A[2][2] = 2;
71     int T; scanf("%d",&T);
72     while(T--){
73         int N; scanf("%d",&N);
74         //mat R = .dat;+R[0][1]+R[0][2]
75         printf("%d\n", (A^N)[0][0]);
76     }
77     return 0;
78 }

矩阵

由初值可知,最后答案为Ak(1,1),复杂度是O(3^3*logN)。

如果利用特征值的话,效率会更高。

A的对角化矩阵Λ为

如果对应的特征向量矩阵为P,Ak = P * Λk * P'。

因为除了对角元都为0,所以可以去掉一个和号,而特征值4对应的系数为1/4,2对应的系数为1/2,因此最终答案为4n-1+2n-1

 1 /*********************************************************
 2 *            ------------------                          *
 3 *   author AbyssalFish                                   *
 4 **********************************************************/
 5 #include<cstdio>
 6 #include<iostream>
 7 #include<string>
 8 #include<cstring>
 9 #include<queue>
10 #include<vector>
11 #include<stack>
12 #include<vector>
13 #include<map>
14 #include<set>
15 #include<algorithm>
16 #include<cmath>
17 using namespace std;
18
19 const int mod = 1e4+7;
20 int pow_mod(int a,int q)
21 {
22     int re = 1;
23     while(q){
24         if(q&1) re = (re*a)%mod;
25         a = (a*a)%mod;
26         q>>=1;
27     }
28     return re;
29 }
30 //#define LOCAL
31 int main()
32 {
33 #ifdef LOCAL
34     freopen("in.txt","r",stdin);
35 #endif
36     int T; scanf("%d",&T);
37     while(T--){
38         int N; scanf("%d",&N);
39         printf("%d\n",(pow_mod(4,N-1)+pow_mod(2,N-1))%mod);
40     }
41     return 0;
42 }

View Code

转载于:https://www.cnblogs.com/jerryRey/p/4945587.html

POJ 3734 Blocks (线性递推)相关推荐

  1. POJ 3734 Blocks 矩阵递推

    POJ3734 比较简单的递推题目,只需要记录当前两种颜色均为偶数, 只有一种颜色为偶数 两种颜色都为奇数 三个数量即可,递推方程相信大家可以导出. 最后来个快速幂加速即可. #include< ...

  2. Codeforces 1106F Lunar New Year and a Recursive Sequence (数学、线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...

    Codeforces 1106F Lunar New Year and a Recursive Sequence (数学.线性代数.线性递推.数论.BSGS.扩展欧几里得算法) 哎呀大水题..我写了一 ...

  3. 【THUSC 2017】如果奇迹有颜色【polya引理】【矩阵】【计数dp】【BM打表+线性递推】

    题意:长度为 nnn 的环染 mmm 种颜色,要求任意相邻 mmm 个元素不能包含全部的颜色.求方案数 模 109+710^9+7109+7,循环同构. n≤109,m≤7n\leq 10^9,m\l ...

  4. [线性代数学习笔记] 线性递推数列及 Berlekamp-Massey 算法的详细推导过程

    线性递推数列 线性递推 对于无限数列 {a0,a1,...}\{a_0,a_1,...\}{a0​,a1​,...} 和有限非空数列 {r0,r1,...,rm−1}\{r_{0},r_1,...,r ...

  5. 【模板】BM + CH(线性递推式的求解,常系数齐次线性递推)

    这里所有的内容都将有关于一个线性递推: $f_{n} = \sum\limits_{i = 1}^{k} a_{i} * f_{n - i}$,其中$f_{0}, f_{1}, ... , f_{k ...

  6. HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )

    题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...

  7. BM求线性递推模板(杜教版)

    BM求线性递推模板(杜教版) BM求线性递推是最近了解到的一个黑科技 如果一个数列.其能够通过线性递推而来 例如使用矩阵快速幂优化的 DP 大概都可以丢进去 则使用 BM 即可得到任意 N 项的数列元 ...

  8. 特征方程求数列的通项公式(二阶线性递推式)

    特征方程求数列的通项公式(二阶线性递推式) 已知数列{an}\{a_n\}{an​}满足fn=afn−1+bfn−2,a,b∈N,b≠0,n>2,f1=c1,f2=c2,(c1,c2f_n=af ...

  9. 组合数学——特征方程与线性递推方程

    组合数学--特征方程与线性递推方程 大多数计数问题都可以表示成线性的递推关系,而特征方程是解决这些线性递推关系的有利工具. 一个度为 kkk 的 线性齐次常系数递推方程 指的是具有如下形式的方程: a ...

  10. 线性递推数列_学习笔记

    前置知识:线代基础(越多越好 发现了一位老哥写的笔记,精炼得相当到位 (这是博客地址嗷) . 线性递推数列 基本性质 定理1.1. 对于无限数列 { a 0 , a 1 , a 2 . . . } \ ...

最新文章

  1. Ret2Libc(2) (有system、无‘/bin/sh’)绕过NX、ASLR
  2. 在leangoo里怎么复制卡片,删除卡片,查看任务轨迹?
  3. 网络推广过程中切忌要注意的问题
  4. 团队项目博客检查结果汇总
  5. python数据库教程_Python连接mysql数据库及简单增删改查操作示例代码
  6. 2021新交规超速处罚规定
  7. php 不解析,php不解析html代码
  8. python beautifulsoup报错bs4 FeatureNotFound Couldnot find a tree builder with the features
  9. iOS开发之App上架流程(2017)
  10. 管理感悟:不要问没经过思考的问题
  11. php Hash Table(二) Hash函数
  12. C语言 数据结构 结构体 LinkList
  13. Silvaco TCAD仿真2——Silvaco TCAD 档名
  14. 明日之后维护服务器什么情况,明日之后无法连接服务器是什么原因
  15. 如何使用networkx导入txt文件数据并绘制
  16. 使用html2canvas实现超出浏览器部分截图
  17. Web后端servlet—使用servlet的Part接口实现单文件多文件上传、以及日期格式转换为sql日期格式的实现
  18. android 世界各国英文简写代码 资源文件
  19. Unity新手引导(圆形指引、矩形指引)
  20. AI一周热闻:12306数据泄露,嫌疑人被捕;BERT提升文档检索性能至1.5-2倍

热门文章

  1. django 数据库交互2
  2. Android APK反编译详解(转)
  3. Spring好处—总结
  4. 收藏个支持进度条与文件拖拽上传的js File Uploader
  5. [简单分页]C#+JQUERY+ORACLE分页效果 ----转载
  6. 在AJAX中可以使用的Response.Redirect 的冲突解决办法
  7. VM安装rhel或linux后,声音很响,如何关闭
  8. c语言中char buffer,C语言对char*的封装,形成buffer
  9. existed hive ods_hive数据仓库建设
  10. OpenCV图像处理(3)——盒维数计算