HDU.2640 Queuing (矩阵快速幂)
HDU.2640 Queuing (矩阵快速幂)
题意分析
不妨令f为1,m为0,那么题目的意思为,求长度为n的01序列,求其中不含111或者101这样串的个数对M取模的值。
用F(n)表示串长为n的合法串的个数。
首先不难通过枚举发现F(0) = 0, F(1) =2, F(3) = 6, F(4) = 9, F(5) = 15.然后引用网上如何求解递推公式的详细解释:
用f(n)表示n个人满足条件的结果,那么如果最后一个人是m的话,那么前n-1个满足条件即可,就是f(n-1);
如果最后一个是f那么这个还无法推出结果,那么往前再考虑一位:那么后三位可能是:mmf, fmf, mff, fff,其中fff和fmf不满足题意所以我们不考虑,但是如果是
mmf的话那么前n-3可以找满足条件的即:f(n-3);如果是mff的话,再往前考虑一位的话只有mmff满足条件即:f(n-4)
所以f(n)=f(n-1)+f(n-3)+f(n-4)
我个人比较喜欢用Trie示意图的方法来求解递推结果,如图所示:

然后构造如图矩阵

代码总览
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <sstream>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#define INF 0x3f3f3f3f
#define nmax 200
#define MEM(x) memset(x,0,sizeof(x))
using namespace std;
const int Dmax = 11;
int N = 4;
int MOD;
int st[] = {0,2,4,6,9,15};
typedef struct{
int matrix[Dmax][Dmax];
void init()//初始化为单位矩阵
{
memset(matrix,0,sizeof(matrix));
for(int i = 0; i<Dmax;++i) matrix[i][i] = 1;
}
}MAT;
MAT ADD(MAT a, MAT b)
{
for(int i = 0; i<N;++i){
for(int j = 0;j<N;++j){
a.matrix[i][j] +=b.matrix[i][j];
a.matrix[i][j] %= MOD;
}
}
return a;
}
MAT MUL(MAT a, MAT b)
{
MAT ans;
for(int i = 0; i<N;++i){
for(int j = 0; j<N;++j){
ans.matrix[i][j] = 0;
for(int k = 0; k<N;++k){
ans.matrix[i][j] += ( (a.matrix[i][k] % MOD) * (b.matrix[k][j] % MOD) ) % MOD;
}
ans.matrix[i][j] %= MOD;
}
}
return ans;
}
MAT POW(MAT a, int t)
{
MAT ans; ans.init();
while(t){
if(t&1) ans = MUL(ans,a);
t>>=1;
a = MUL(a,a);
}
return ans;
}
void OUT(MAT a)
{
for(int i = 0; i<N;++i){
for(int j = 0; j<N;++j){
printf("%5d",a.matrix[i][j]);
}
printf("\n");
}
}
void IN(MAT & a,MAT & temp)
{
memset(a.matrix,0,sizeof(a.matrix));
memset(temp.matrix,0,sizeof(temp.matrix));
for(int i = 0; i<N;++i) a.matrix[i][0] = st[5-i];
for(int i = 0; i<N;++i){if(i == 1) continue;temp.matrix[0][i] = 1;}
for(int i = 1;i<N;++i) temp.matrix[i][i-1] = 1;
}
void CAL(MAT a)
{
printf("%d\n",a.matrix[0][0] % MOD);
}
int main()
{
//freopen("in.txt","r",stdin);
int K;
while(scanf("%d%d",&K,&MOD) != EOF){
if(K<=5){
printf("%d\n",st[K]%MOD);
continue;
}
MAT init,temp;
IN(init,temp);
temp = POW(temp,K-5);
temp = MUL(temp,init);
CAL(temp);
}
return 0;
}
HDU.2640 Queuing (矩阵快速幂)的更多相关文章
- HDU 5667 构造矩阵快速幂
HDU 5667 构造矩阵快速幂 题目描述 解析 我们根据递推公式 设 则可得到Q的指数关系式 求Q构造矩阵 同时有公式 其中φ为欧拉函数,且当p为质数时有 代码 #include <cstdi ...
- HDU 6185 Covering 矩阵快速幂
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6185 题意:用 1 * 2 的小长方形完全覆盖 4 * n的矩形有多少方案. 解法:小范围是一个经典题 ...
- HDU 2157(矩阵快速幂)题解
How many ways?? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 6395 分段矩阵快速幂 HDU 6386 建虚点+dij
http://acm.hdu.edu.cn/showproblem.php?pid=6395 Sequence Time Limit: 4000/2000 MS (Java/Others) Me ...
- HDU 6470 【矩阵快速幂】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6470 写这道题是为了让自己不要忘记矩阵快速幂如何推出矩阵式子的. 注意 代码是TLE的!! #incl ...
- HDU 5607 graph 矩阵快速幂 + 快速幂
这道题得到了学长的助攻,其实就是一个马尔科夫链,算出一步转移矩阵进行矩阵快速幂就行了,无奈手残 这是我第一回写矩阵快速幂,写的各种毛病,等到调完了已经8点44了,交了一发,返回PE,(发现是少了换行) ...
- HDU 1575(裸矩阵快速幂)
emmmmm..就是矩阵快速幂,直接附代码: #include <cstdio> using namespace std; ; ; struct Matrix { int m[maxn][ ...
- hdu 6395Sequence【矩阵快速幂】【分块】
Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total ...
- Reading comprehension HDU - 4990 (矩阵快速幂 or 快速幂+等比数列)
;i<=n;i++) { )ans=(ans*+)%m; %m; } 给定n,m.让你用O(log(n))以下时间算出ans. 打表,推出 ans[i] = 2^(i-1) + f[i-2] 故 ...
随机推荐
- springboot在application.yml中使用了context-path属性导致静态资源法加载,如不能引入vue.js,jquery.js,css等等
在springBoot配置中加入上下文路径 server.context-path=/csdn js,img等静态文件无法加载,出现404的问题 <script type="text/ ...
- SpringMVC+mybatis+maven+Ehcache缓存实现
所谓缓存,就是将程序或系统经常要调用的对象存在内存中,以便其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. 缓存主要可分为二大类: 一.通过文件缓存,顾名思义文 ...
- ConfigHelpers
--默认值可以不传 local ConfigHelpers = {} --设置物体高亮 target:设置对象 isLigth:是否高亮 seeThrough:是否穿透(默认为true,穿透) sta ...
- Python全栈 项目(电子词典、协程、pdb调试)
后面我就不截图了 大家还是看原文吧 https://yq.aliyun.com/articles/629534 . ................. ...
- HADOOP-输出数据实体类承载
新建一个bean包: 1.实现Writerable 2.有一个空的构造方法 代码实现: import java.io.DataInput; import java.io.DataOutput; imp ...
- C二维数组行为空,列不为空
二维数组: 处理二维数组得函数有一处可能不太容易理解:数组的行可以在函数调用时传递,但是数组的列却只能被预置在函数内部. eg: #define COLS 4 int sum(int ar[][COL ...
- 【转载】OpenCV(C++ 与 Python 的比较)与 MATLAB 的比较
原文作者 : Satya Mallick 译者 : aleen42 原文 https://aleen42.gitbooks.io/personalwiki/content/translation/o ...
- SpringCloud IDEA 教学 (二) Eureka Service
写在开头 本篇继续介绍基于Eureka的SpringCloud微服务搭建,回顾一下搭建过程, 第一步:建立一个服务注册中心: 第二步:建立微服务并注入到注册中心: 第三步:建立client端来访问微服 ...
- JS中Document节点总结
document对象是documentHTML的一个实例,也是window对象的一个属性,因此可以将document对象作为一个全局对象来访问. Document节点的子节点可以是DocumentTy ...
- 如何:调试 .NET Framework 源代码
文章标题:如何:调试 .NET Framework 源代码 文章地址:https://technet.microsoft.com/zh-cn/cc667410.aspx