HDU 2604 矩阵快速幂
题目大意
给定长度为l的只有f,m两种字母 的序列,问不出现fff,fmf的序列个数有多少个
每次的下一个状态都与前一次状态的后两个字母有关
比如我令mm : 0 , mf : 1 , fm : 2 , ff : 3;
那么dp[i][j] 表示长度为i的序列最后由j状态结尾的总个数,当然 j 要大于2
dp[i][0] = dp[i-1][0] + dp[i-1][2]
dp[i][1] = dp[i-1][0]
dp[i][2] = dp[i-1][1] + dp[i-1][3]
dp[i][3] = dp[i-1][1]
根据这个递推关系,我们就能很容易地用动态规划解这道题目,然后就发现超时了 。。。
换个角度把dp值当作矩阵看 (dp[i][0] , dp[i][1] , dp[i][2] , dp[i][3]) = {{1 , 1 , 0 , 0} , {0 , 0 , 1, 1} , {1 , 0 , 0 ,0} , {0 , 0 ,1 , 0}} *(dp[i-1][0] , dp[i-1][1] , dp[i-1][2] , dp[i-1][3])
然后连续乘法上进行优化
while(n){
if(n & 1) ~
~
n>>=1
}
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int l , M; struct Matrix{
int m[][];
Matrix operator*(const Matrix &p)const {
Matrix tmp;
for(int i = ; i < ; i++)
for(int j = ; j< ; j++){
tmp.m[i][j] = ;
for(int k = ; k< ; k++){
tmp.m[i][j] += m[i][k] * p.m[k][j];
tmp.m[i][j] %= M;
}
}
return tmp;
}
void show(){
for(int i = ; i< ; i++){
for(int j = ; j< ; j++){
printf("%d " , m[i][j]);
}
puts("");
}
}
}; Matrix pow(Matrix a , int n)
{
Matrix tmp;
memset(tmp.m , , sizeof(tmp.m));
//建立一个单位矩阵
for(int i = ; i< ; i++)
tmp.m[i][i] = ; while(n){
if(n & ) tmp = tmp*a;
a = a * a;
n >>= ;
}
return tmp;
} int main()
{
while(~scanf("%d%d" , &l , &M)){
if(l == ) puts("");
else if(l == ) printf("%d\n" , %M);
else{
Matrix a;
a.m[][] = , a.m[][] = , a.m[][] = , a.m[][] = ;
a.m[][] = , a.m[][] = , a.m[][] = , a.m[][] = ;
a.m[][] = , a.m[][] = , a.m[][] = , a.m[][] = ;
a.m[][] = , a.m[][] = , a.m[][] = , a.m[][] = ; Matrix t = pow(a , l-); int ans = ;
int b[] = { , , , };
for(int i = ; i< ; i++)
for(int j = ; j< ; j++){
ans += b[j] * t.m[j][i];
}
printf("%d\n" , ans % M);
}
}
return ;
}
HDU 2604 矩阵快速幂的更多相关文章
- hdu 2604 矩阵快速幂模板题
/* 矩阵快速幂: 第n个人如果是m,有f(n-1)种合法结果 第n个人如果是f,对于第n-1和n-2个人有四种ff,fm,mf,mm其中合法的只有fm和mm 对于ffm第n-3个人只能是m那么有f( ...
- HDU - 2604 矩阵快速幂 字符串递推 两种解法
记dp[i]为长度i且符合题意的方案数,dp[n]就是解 符合方案的是不含fmf和fff子串的字符串 考虑如何从前面几项递推出后面第i项 (★表示存在生成的非法方案)←其实没啥用处 i=1时 m③ f ...
- HDU 2855 (矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855 题目大意:求$S(n)=\sum_{k=0}^{n}C_{n}^{k}Fibonacci(k)$ ...
- HDU 4471 矩阵快速幂 Homework
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4471 解题思路,矩阵快速幂····特殊点特殊处理····· 令h为计算某个数最多须知前h个数,于是写 ...
- HDU - 1575——矩阵快速幂问题
HDU - 1575 题目: A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input数据的第一行是一个T,表示有T组数据. 每组数据的第一行有n( ...
- hdu 1757 (矩阵快速幂) 一个简单的问题 一个简单的开始
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757 题意不难理解,当x小于10的时候,数列f(x)=x,当x大于等于10的时候f(x) = a0 * ...
- 随手练——HDU 5015 矩阵快速幂
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5015 看到这个限时,我就知道这题不简单~~矩阵快速幂,找递推关系 我们假设第一列为: 23 a1 a2 ...
- HDU 3802 矩阵快速幂 化简递推式子 加一点点二次剩余知识
求$G(a,b,n,p) = (a^{\frac {p-1}{2}}+1)(b^{\frac{p-1}{2}}+1)[(\sqrt{a} + \sqrt{b})^{2F_n} + (\sqrt{a} ...
- How many ways?? HDU - 2157 矩阵快速幂
题目描述 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的 ...
随机推荐
- codevs1669(dfs)子集和目标值
1692 子集和的目标值 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给定n个整数in和目标值T,求某一非空子集 ...
- Html5 编程题
1.请写出下面所示的控件的html 代码? <div> <div><a>姓名:</a><input type="text" ...
- 图灵机(转自wiki)
图灵机(英语:Turing machine),又称确定型图灵机,是英国数学家艾伦·图灵于1936年提出的一种抽象计算模型,其更抽象的意义为一种数学逻辑机,可以看作等价于任何有限逻辑数学过程的终极强大逻 ...
- python调用chrome ie等浏览器
chrome: 首先,要安装下谷歌浏览器,查看谷歌浏览器的版本,对应版本下载相应的chromedriver插件,http://blog.csdn.net/huilan_same/article/det ...
- Hbase源码分析:RPC概况
RPC是hbase中Master,RegionServer和Client三者之间通信交流的纽带.了解hbase的rpc机制能够为通过源码学习hbase奠定良好的基础.因为了解了hbase的rpc机制能 ...
- 24 C#的类和对象
类是C#面向对象编程的基本单元.一个类都可以包含2种成员:字段和方法. 1)类的字段代表类中被处理的数据(变量): 2)类的方法代表对这些数据的处理过程或用于实现某种特定的功能,方法中的代码往往需 ...
- Git学习笔记(0)-错误汇总
一.LF will be replaced by CRLF 1.发现问题 $ git add welcome.txt warning: LF will be replaced by CRLF in w ...
- poj1240 Pre-Post-erous!
思路: 根据前序序列和后序序列递归构造m叉树,确定每个节点的子节点数量.再用组合数公式累乘. 实现: #include <iostream> using namespace std; ][ ...
- Unity笔记(3)自学第三天
学习记录: 脚本使用:
- mongodb GUI工具
人性化,界面工具 网上搜索找的一些 1. 官方网站 tools 2. adminMongo 这个也是我在使用的 3. MongoClient 4. NoSQL Manager for MongoDB ...