矩阵快速幂小结-Hdu2604
矩阵快速幂可以想象为线性代数的矩阵相乘,主要是运用于高效的计算矩阵高次方。
将矩阵两两分组,若要求a^n,即知道a^(n/2)次方即可,矩阵快速幂便是运用的这个思路。
比方想求(A)^7那么(A)^6=(A*A)*(A*A)*(A*A),我们知道A*A此时再算三次便可得到答案,比起原先的计算已经简便了很多。
矩阵快速幂的主要思路是找到关键的那个矩阵,并把它构建出来,此时思路就基本差不多了。
举例:Hdu2604
题意:f和m两种字母组成字符串,fmf 和 fff 这种为不安全的字符串,现在有2*L个字母,问你有多少安全的字符串。答案mod M。
我们将0, 1, 2, 3, 4, 5的答案算出来我们便可以得到一个公式f(n)=f(n-1)+f(n-3)+f(n-4),此时我们要做的便是构建那个矩阵,如何构建呢。
我们可以得到
这样的一个矩阵。
int n, modd;
int a[4], f[4]; struct Matrix{
ll mat[4][4];
Matrix operator*(const Matrix& m)const{
Matrix tmp;
for (int i=0; i <4; i++) {
for (int j=0; j<4; j++) {
tmp.mat[i][j]=0;
for (int k=0; k<4; k++) {
tmp.mat[i][j] += mat[i][k]*m.mat[k][j]%modd;
tmp.mat[i][j]%=modd;
}
}
}
return tmp;
}
};
ll Pow(Matrix &m, int k) {
Matrix ans;
memset(ans.mat, 0, sizeof(ans.mat));
for (int i = 0; i < 4; i++) ans.mat[i][i]=1;
while(k) {
if (k&1) ans=ans*m;
k>>=1;
m=m*m;
}
ll sum=0;
for (int i = 0; i < 4; i++) {
sum += ans.mat[0][i]*f[3-i]%modd;
sum%=modd;
}
return sum%modd;
}
void solve() {
Matrix m;
f[0]=1, f[1]=2, f[2]=4, f[3]=6;
while(scanf("%d%d", &n, &modd)!=EOF) {
if (n<4) printf("%d\n", f[n]%modd);
else {
memset(m.mat, 0, sizeof(m.mat));
m.mat[0][0]=m.mat[0][2]=m.mat[0][3]=1;
m.mat[1][0]=m.mat[2][1]=m.mat[3][2]=1;
printf("%d\n", Pow(m, n-3)%modd);
}
}
}
矩阵快速幂小结-Hdu2604的更多相关文章
- hdu2604(递推,矩阵快速幂)
题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...
- 【递推+矩阵快速幂】【HDU2604】【Queuing】
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- HDU2604【矩阵快速幂】
思路: 把fm看成01,f-1,m-0: 不能存在101,111; dp[i]代表第i结尾的方案数: ①:结尾是0一定行:只要i-1序列里添个0就好了,dp[i]+=dp[i-1]: ②:结尾是1 ...
- HDU2604:Queuing(矩阵快速幂+递推)
传送门 题意 长为len的字符串只由'f','m'构成,有2^len种情况,问在其中不包含'fmf','fff'的字符串有多少个,此处将队列换成字符串 分析 矩阵快速幂写的比较崩,手生了,多练! 用f ...
- hdu2604 矩阵快速幂
题意: 给你n个人,排成一个长度是n的队伍,人只有两类f,m,问可以有多少种排法使度列中不出现fff,fmf这样的子串.思路: 一开始暴力,结果超时了,其实这个题目要是能找到类似于 ...
- 【做题】SRM701 Div1 Hard - FibonacciStringSum——数学和式&矩阵快速幂
原文链接 https://www.cnblogs.com/cly-none/p/SRM701Div1C.html 题意:定义"Fibonacci string"为没有连续1的01串 ...
- HDU 2604 Queuing( 递推关系 + 矩阵快速幂 )
链接:传送门 题意:一个队列是由字母 f 和 m 组成的,队列长度为 L,那么这个队列的排列数为 2^L 现在定义一个E-queue,即队列排列中是不含有 fmf or fff ,然后问长度为L的E- ...
- 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)
题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...
- 51nod 算法马拉松18 B 非010串 矩阵快速幂
非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...
随机推荐
- idea插件推荐
CodeGlance 类似SublimeText的Mini Map插件 Background Image Plus 这又是一款装备B插件了,想想别人看到你的IDE有个美女或者异次元背景是怎样的,安装 ...
- cf-Global Round2-D. Frets On Fire(二分)
题目链接:http://codeforces.com/contest/1119/problem/D 题意:给n(<=1e5)个数s[i],i=1..n,(0<=s[i]<=1e18) ...
- 【转】chrome devtools protocol——Web 性能自动化
前言 在测试Web页面加载时间时,可能会是这样的: 打开chrome浏览器. 按F12打开开发者工具. 在浏览器上打开要测试的页面 查看开发者工具中Network面板的页面性能数据并记录 或者在开发者 ...
- Disruptor框架EventProcessor和Workpool的使用
场景使用: 在HelloWorld的实例中,我们创建Disruptor实例,然后调用getRingBuffer方法去获取RingBuffer,其实在很多时候,我们可以直接使用RingBuffer,以及 ...
- nodejs异步读数据库
以下代码不完美,但讲明了使用方法. 回调: function selectUser(callback) { var sql = "SELECT * FROM user"; conn ...
- 数据库(mysql)
一.left join right join inner join left join(左连接),在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录. right join(右 ...
- go语言处理文件上传和多个文件上传
uploadOne.html代码如下: <!doctype html> <html lang="en"> <head> <meta cha ...
- ROS与深度相机入门教程-在ROS使用kinect v1摄像头
ROS与深度相机入门教程-在ROS使用kinect v1摄像头 说明: 介绍在ros安装和使用kinect v1摄像头 介绍freenect包 安装驱动 deb安装 $ sudo apt-get in ...
- mysql 常用 sql
查询表创建时间.修改时间等 SELECT * FROM information_schema.tables WHERE table_schema='ty_supplier' AND table_ ...
- linux查看文件被哪个进程占用?
1> 如果文件是端口号 netstat -ntlp | grep portNum [root@localhost root]# netstat -ntlp Active Internet con ...