POJ 3734 Blocks (线性递推)
定义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 (线性递推)相关推荐
- POJ 3734 Blocks 矩阵递推
POJ3734 比较简单的递推题目,只需要记录当前两种颜色均为偶数, 只有一种颜色为偶数 两种颜色都为奇数 三个数量即可,递推方程相信大家可以导出. 最后来个快速幂加速即可. #include< ...
- Codeforces 1106F Lunar New Year and a Recursive Sequence (数学、线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...
Codeforces 1106F Lunar New Year and a Recursive Sequence (数学.线性代数.线性递推.数论.BSGS.扩展欧几里得算法) 哎呀大水题..我写了一 ...
- 【THUSC 2017】如果奇迹有颜色【polya引理】【矩阵】【计数dp】【BM打表+线性递推】
题意:长度为 nnn 的环染 mmm 种颜色,要求任意相邻 mmm 个元素不能包含全部的颜色.求方案数 模 109+710^9+7109+7,循环同构. n≤109,m≤7n\leq 10^9,m\l ...
- [线性代数学习笔记] 线性递推数列及 Berlekamp-Massey 算法的详细推导过程
线性递推数列 线性递推 对于无限数列 {a0,a1,...}\{a_0,a_1,...\}{a0,a1,...} 和有限非空数列 {r0,r1,...,rm−1}\{r_{0},r_1,...,r ...
- 【模板】BM + CH(线性递推式的求解,常系数齐次线性递推)
这里所有的内容都将有关于一个线性递推: $f_{n} = \sum\limits_{i = 1}^{k} a_{i} * f_{n - i}$,其中$f_{0}, f_{1}, ... , f_{k ...
- HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )
题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...
- BM求线性递推模板(杜教版)
BM求线性递推模板(杜教版) BM求线性递推是最近了解到的一个黑科技 如果一个数列.其能够通过线性递推而来 例如使用矩阵快速幂优化的 DP 大概都可以丢进去 则使用 BM 即可得到任意 N 项的数列元 ...
- 特征方程求数列的通项公式(二阶线性递推式)
特征方程求数列的通项公式(二阶线性递推式) 已知数列{an}\{a_n\}{an}满足fn=afn−1+bfn−2,a,b∈N,b≠0,n>2,f1=c1,f2=c2,(c1,c2f_n=af ...
- 组合数学——特征方程与线性递推方程
组合数学--特征方程与线性递推方程 大多数计数问题都可以表示成线性的递推关系,而特征方程是解决这些线性递推关系的有利工具. 一个度为 kkk 的 线性齐次常系数递推方程 指的是具有如下形式的方程: a ...
- 线性递推数列_学习笔记
前置知识:线代基础(越多越好 发现了一位老哥写的笔记,精炼得相当到位 (这是博客地址嗷) . 线性递推数列 基本性质 定理1.1. 对于无限数列 { a 0 , a 1 , a 2 . . . } \ ...
最新文章
- Ret2Libc(2) (有system、无‘/bin/sh’)绕过NX、ASLR
- 在leangoo里怎么复制卡片,删除卡片,查看任务轨迹?
- 网络推广过程中切忌要注意的问题
- 团队项目博客检查结果汇总
- python数据库教程_Python连接mysql数据库及简单增删改查操作示例代码
- 2021新交规超速处罚规定
- php 不解析,php不解析html代码
- python beautifulsoup报错bs4 FeatureNotFound Couldnot find a tree builder with the features
- iOS开发之App上架流程(2017)
- 管理感悟:不要问没经过思考的问题
- php Hash Table(二) Hash函数
- C语言 数据结构 结构体 LinkList
- Silvaco TCAD仿真2——Silvaco TCAD 档名
- 明日之后维护服务器什么情况,明日之后无法连接服务器是什么原因
- 如何使用networkx导入txt文件数据并绘制
- 使用html2canvas实现超出浏览器部分截图
- Web后端servlet—使用servlet的Part接口实现单文件多文件上传、以及日期格式转换为sql日期格式的实现
- android 世界各国英文简写代码 资源文件
- Unity新手引导(圆形指引、矩形指引)
- AI一周热闻:12306数据泄露,嫌疑人被捕;BERT提升文档检索性能至1.5-2倍
热门文章
- django 数据库交互2
- Android APK反编译详解(转)
- Spring好处—总结
- 收藏个支持进度条与文件拖拽上传的js File Uploader
- [简单分页]C#+JQUERY+ORACLE分页效果 ----转载
- 在AJAX中可以使用的Response.Redirect 的冲突解决办法
- VM安装rhel或linux后,声音很响,如何关闭
- c语言中char buffer,C语言对char*的封装,形成buffer
- existed hive ods_hive数据仓库建设
- OpenCV图像处理(3)——盒维数计算