【递推矩阵快速幂】hdu 2604
我们可以这样想:一个合法串可以由两个较短的合法串组成
就以d[n]为例:(注意不能重复)
1、n-1个字符的时候: +m
2、n-2: 只能+mm,会和n-1重复,所以不考虑n-2
3、n-3: +mmf
4、n-4: +mmff
5、n-5: 如果是+mmffm,会与n-1重复,+mmmff会与n-4重复,+mmmmf会与n-3重复(不考虑)
所以就考虑n-1,n-3,n-4,DP等式就出来了:dp[n]=dp[n-1]+dp[n-3]+dp[n-4]
矩阵快速幂
#include <map>
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <time.h>
#include <cstdio>
#include <math.h>
#include <iomanip>
#include <cstdlib>
#include <limits.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;#define LL long long
#define MIN INT_MIN
#define MAX INT_MAX
#define PI acos(-1.0)
#define FRE freopen("input.txt","r",stdin)
#define FF freopen("output.txt","w",stdout);
int MOD ;
#define n 4
struct Mat{int mat[4][4];
};
//初始化单位矩阵
Mat init(){Mat E;for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){if(i == j)E.mat[i][i] = 1;elseE.mat[i][j] = 0;}}return E;
}
//重载乘法
Mat operator *(Mat a,Mat b){Mat c;memset(c.mat,0,sizeof(Mat));for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){for(int k = 0; k < n; k++){if(a.mat[i][k] && b.mat[k][j]){c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD;}}}}return c;
}
//重载加法
Mat operator +(Mat a,Mat b){Mat c;memset(c.mat,0,sizeof(Mat));for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){c.mat[i][j] = (a.mat[i][j] + b.mat[i][j]) % MOD;}}return c;
}
//重载幂次方
Mat operator ^(Mat A,LL x){if(x == 1)return A;Mat c;c = init();for(; x ; x >>= 1){if(x&1){c = c*A;}A = A*A;}return c;
}
int main(){int l,m;int f[4] = {2,4,6,9};Mat gao = {1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0};while(scanf("%d%d",&l,&m)!=EOF){if(!l){printf("0\n");}elseif(l<=4)printf("%d\n",f[l-1]);else{MOD = m;Mat ans = gao^(l-4);int res = ans.mat[0][0]*9 + ans.mat[0][1]*6 + ans.mat[0][2]*4 + ans.mat[0][3]*2;printf("%d\n",res%m);}}return 0;
}
【递推矩阵快速幂】hdu 2604相关推荐
- 递推+矩阵快速幂 HDU 2065
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace ...
- 湘潭赛Easy wuxing(递推+矩阵快速幂or DP)
湘潭赛Easy wuxing(递推+矩阵快速幂or DP) 十分感谢老师的思路! 题目描述 "五行"是中国传统哲学思想,它认为认为大自然的现象由"木.火.土.金.水&qu ...
- HDU - 6185 Covering(暴搜+递推+矩阵快速幂/杜教BM)
题目链接:点击查看 题目大意:规定宽度为4,给定长度为n,求用1*2和2*1的瓷砖,将其完全铺满能有多少种方法. 分析:自从学会了矩阵快速幂之后,看到1e18的数据量都会下意识的往递推上面想,但是以前 ...
- Recursive sequence HDU - 5950 (递推 矩阵快速幂优化)
题目链接 F[1] = a, F[2] = b, F[i] = 2 * F[i-2] + F[i-1] + i ^ 4, (i >= 3) 现在要求F[N] 类似于斐波那契数列的递推式子吧, 但 ...
- HDOJ 2604 Queuing (递推+矩阵快速幂)
点击打开链接 题意:给你一个长度为L的由m和f两种字母组成的字符串,定义存在fmf以及fff子串的都是不符合要求的串,问长度为L的符合要求的串有多少个? 解题思路: 首先找出递推关系式,先给出递推关系 ...
- Happy Necklace dp 递推 矩阵快速幂
当满足素数2和素数3的条件后,下一个素数区间5乃至之后的都会被满足. 考虑能否从f[n - 1]转换到f[n],考虑第i - 1位,如果后面加红色一定满足条件,所以f[n]先是加上f[n - 1] 如 ...
- POj 3420 Quad Tiling 状态压缩DP+递推+矩阵快速幂
哈哈,写了好久的,总算对了. 接下来介绍两种思路: 先介绍一种 递推+矩阵的快速幂的方法 一种DP的思想考虑4×n的最后一列 ,可以放的方法一共有5种 1.放4个 1×2 则 为dp[n-2] ...
- NYOJ 1075 (递推 + 矩阵快速幂)
"红色病毒"问题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 医学研究者最近发现了一种新病毒,因为其蔓延速度与曾经在Internet上传播的&qu ...
- BZOJ 1411Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
1411: [ZJOI2009]硬币游戏 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 897 Solved: 394 [Submit][Stat ...
最新文章
- 批量处理SQL Oracle下:
- react学习(73)--子组件this
- 图片文字美化广告位代码 广告源码
- JavaScript萌新基础
- linux卡片电脑源码,x4412开发板ibox卡片电脑项目实战9-搭建最简单的linux文件系统...
- GitLab 配置 OAuth2 实现第三方登录,简直太方便了!
- 指定JDK版本运行Tomcat
- 借书卡程序设计java_java图书馆借书编程求解
- OpenCV-Python中的简单数字识别OCR
- Win10华硕atk驱动怎么安装_雨林木风win10系统U盘怎么安装
- python在冒号处显示语法错误_python for常见语法错误
- OpenCV-学习历程4- 读取图像/读取像素/修改像素值方法(包含灰度+rgb图像像素处理方式)
- 银行对公业务和对私业务
- 计算机网络图标在哪里照,网络设备图标-电脑上的网络图标怎么显示
- 史上最全场景文字识别资源汇集(56篇重要论文 + 20 个开源代码 + 330 个实验结果 + 1882个统计信息)...
- 数据结构笔记(王道考研) 第八章:排序
- 点名器——随机数的应用
- Shell攻关之运算符
- C++中的对齐方式及sizeof小结
- 程序员的英文代号_构建一个代号为1的聊天应用程序2