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校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的 ...
随机推荐
- FTP文件服务器
import java.io.InputStream; import java.io.Serializable; import lombok.Data; @Data public class FtpB ...
- Js 使用小技巧总结(1)
1.Js 的时间控制,小于初始时间,大于截止时间 <script type="text/javascript"> window.onload = Game ...
- [转]C语言字符串操作总结大全(超详细)
1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度 ...
- UE编辑器编译和运行java设置
工具原料: UE编辑器 1点击“高级”,再点击“工具配置”. 2点击“插入”,在“菜单项”名称上输入“编译java程序”,在“命令行”里输入“javac %n%e”,在工作目录上填“%p”. 3切换到 ...
- JavaScript 兼容新旧版chrome和firefox的桌面通知
1.新/旧版本的chrome和firefox都可支持,IE下不支持因此设置为了在最小化窗口处闪烁显示提示文字. 2.设置为提示窗口显示5秒即关闭. 3.可设置图标和点击提示窗口要跳转到的页面(见输入参 ...
- MVC之参数验证(三)
在实际开发中,项目经理会一直强调一句话,永远不要相信客户端的数据(前端可以不用验证,但是后端必须验证).大家同意这样的说法吧..新端验证毋庸质疑JS验证,提高用户体验我们不得不添加一些与后端一致的验证 ...
- Android集成微信分享功能应用签名生成方法及分享不生效的问题
通过友盟sdk集成微博.微信.qq等分享功能时,微博和qq很顺利,但在做微信集成时一直不成功.主要问题还是之前在微信开放平台申请创建移动应用时,对应用签名没有填写对,走了很多弯路现总结出来,加深记忆避 ...
- Hue - Error loading MySQLdb module: libmysqlclient.so.20: cannot open shared object file: No such file or
解决下面两点异常 >> 1. Hue页面 点击DB 查询时弹出: Error loading MySQLdb module: libmysqlclient.so.20: cannot op ...
- NX自动出图
小秀一下战果: 1. 自动添加图框2. 自动添加投影视图3. 自动标注外形尺寸4. 根据工艺要求,自动添加公差5. 自动孔表6. 批量打印 欢迎大家积极吐槽哈 [视频演示] http://v.youk ...
- 左耳听风 ARTS Week 002
要求:1.每周至少做一个 leetcode 的算法题 2.阅读并点评至少一篇英文技术文章 3.学习至少一个技术技巧 4.分享一篇有观点和思考的技术文章 1.每周至少做一个 leetcode 的算法题 ...