题目大意

给定长度为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 矩阵快速幂的更多相关文章

  1. hdu 2604 矩阵快速幂模板题

    /* 矩阵快速幂: 第n个人如果是m,有f(n-1)种合法结果 第n个人如果是f,对于第n-1和n-2个人有四种ff,fm,mf,mm其中合法的只有fm和mm 对于ffm第n-3个人只能是m那么有f( ...

  2. HDU - 2604 矩阵快速幂 字符串递推 两种解法

    记dp[i]为长度i且符合题意的方案数,dp[n]就是解 符合方案的是不含fmf和fff子串的字符串 考虑如何从前面几项递推出后面第i项 (★表示存在生成的非法方案)←其实没啥用处 i=1时 m③ f ...

  3. HDU 2855 (矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855 题目大意:求$S(n)=\sum_{k=0}^{n}C_{n}^{k}Fibonacci(k)$ ...

  4. HDU 4471 矩阵快速幂 Homework

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4471 解题思路,矩阵快速幂····特殊点特殊处理····· 令h为计算某个数最多须知前h个数,于是写 ...

  5. HDU - 1575——矩阵快速幂问题

    HDU - 1575 题目: A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973.  Input数据的第一行是一个T,表示有T组数据. 每组数据的第一行有n( ...

  6. hdu 1757 (矩阵快速幂) 一个简单的问题 一个简单的开始

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757 题意不难理解,当x小于10的时候,数列f(x)=x,当x大于等于10的时候f(x) = a0 * ...

  7. 随手练——HDU 5015 矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5015 看到这个限时,我就知道这题不简单~~矩阵快速幂,找递推关系 我们假设第一列为: 23 a1 a2 ...

  8. 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} ...

  9. How many ways?? HDU - 2157 矩阵快速幂

    题目描述 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的 ...

随机推荐

  1. MySql数据库创建表

    3.3.MySql数据库创建表 创建5个表: UserInfo用户基础表 Role 角色表 MenuInfo 菜单即控制表 Relation_Role_Menu 角色对应菜单关系表 RelaTion_ ...

  2. git分支的理解

    分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平行宇宙合并 ...

  3. IDEA 激活方式

    最新的IDEA激活方式 使用网上传统的那种输入网址的方式激活不了,使用http://idea.lanyus.com/这个网站提供的工具进行 1.进入hosts文件中:C:\Windows\System ...

  4. python自动化测试学习笔记-9python的日志模块

    参考 logging模块,用来处理python中的日志: import logging logging.debug('debug')logging.info('info')logging.warnin ...

  5. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 Minimum Distance in a Star Graph

    In this problem, we will define a graph called star graph, and the question is to find the minimum d ...

  6. C# 事件与委托(转载)

    委托的定义 delegate 是 C# 中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate 类能够拥有一个方法的签名(signature),并且它"只 ...

  7. ES6 学习笔记 - let和const

    let 和 const 命令 学习资料:ECMAScript 6 入门 let 所声明的变量,只在let命令所在的代码块内有效.用途:循环计数器. 如果使用var,只有一个全局变量i: var a = ...

  8. Hibernate框架之Criteria 详解

    自从学数据库以来,从SQL查询-HQL查询-到Criteria 查询.有人问我:掌握一种查询语句不就可以吗,为什么还要学Criteria 查询?我回答道:用到特定于数据库的SQL 语句,程序本身会依赖 ...

  9. 你的宽带ip地址被100.64了吗?

    你的宽带ip地址被100.64了吗?   最近需要用外网的时候发现,宿舍路由wan口的ip变成了100.64.X.X,本以为是一个外网的ip,可事实上并不是,并且从外网无法直接访问.   首先,我们都 ...

  10. 已集成 VirtIO驱动windows server 2012, 2008, 2003的ISO镜像下载

    已集成 VirtIO驱动简体中文windows server 2012, 2008, 2003系统ISO镜像下载地址. 适用于上传自定义ISO并且使用 VirtIO驱动的kvm架构vps,vultr家 ...