hdu2604 递推转换矩阵快速幂
刚开始还以为用位运算与或几下几个循环就搞定了,算着算着发现不行........
还是一种固定的切题角度,我假设有长度为n,总的排列数位f(n),怎么算他呢?从后往前考虑,因为大多数情况,都是用前面的结果推后面的结果, 那么当第n位是m的时候,如果我知道f(n-1)等于多少,那么f(n-1)的排列+加一个m是不是就是f(n)的一部分解了? 对吧,以此类推, 当第n位为f的时候,可是fff,fmf不能连着 那是不是就剩下ffm,fmm的情况了,对于前者ffm,由于不能凑成ffmf的情况,所以只能是f(n-4). 对于后者fmm,无论邻接m的是什么都不会冲突,所以有f(n-3).至此全了,第n位的所有情况都考虑到了,那么就算出了以下公式:
f(n)=f(n-1)+f(n-3)+f(n-4)
写出代码拍上去发现超时了..........莫办法只能矩阵优化一下看看了.
我们设 有矩阵A 使 (f[n],f[n-1],f[n-2],f[n-3]) = (f[n-1],f[n-2],f[n-3],f[n-4])*A成立
求出A={{1,0,1,1},{1,0,0,0},{0,1,0,0},{0,0,1,0}}
所以有 (f[n],f[n-1],f[n-2],f[n-3])=(f[1],f[2],f[3],f[4])*A的n-4次幂
上代码
#include<cstdio>
#include<cstring>
#include<iostream> using namespace std; int answer[];
struct mac
{
int m[][];
};
mac power(mac x,mac y,int p)
{
mac temp;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
temp.m[i][j]=;
for(int k=;k<;k++)
temp.m[i][j]=(temp.m[i][j]+x.m[i][k]*y.m[k][j])%p;
}
}
return temp;
}
void eachother(int n,int k)
{
mac pri,unit;
memset(unit.m,,sizeof(unit.m));
memset(pri.m,,sizeof(pri.m));
unit.m[][]=unit.m[][]=unit.m[][]=unit.m[][]=;
pri.m[][]=pri.m[][]=pri.m[][]=pri.m[][]=pri.m[][]=pri.m[][]=;
while(n)
{
if(n&)
{
unit = power(unit,pri,k);
}
pri = power(pri,pri,k);
n >>= ;
}
int ans = (answer[]*unit.m[][]+answer[]*unit.m[][]+answer[]*unit.m[][]+answer[]*unit.m[][])%k;
printf("%d\n",ans);
}
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(answer,,sizeof(answer));
answer[]=;
answer[]=;
answer[]=;
answer[]=;
if(n<=)
{
printf("%d\n",answer[n]%k);
}
else{
eachother(n-,k);
}
}
return ;
}
hdu2604 递推转换矩阵快速幂的更多相关文章
- [HDOJ2604]Queuing(递推,矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604 递推式是百度的,主要是练习一下如何使用矩阵快速幂优化. 递推式:f(n)=f(n-1)+f(n- ...
- HDU5950 Recursive sequence 非线性递推式 矩阵快速幂
题目传送门 题目描述:给出一个数列的第一项和第二项,计算第n项. 递推式是 f(n)=f(n-1)+2*f(n-2)+n^4. 由于n很大,所以肯定是矩阵快速幂的题目,但是矩阵快速幂只能解决线性的问题 ...
- hihoCoder 1143 : 骨牌覆盖问题·一(递推,矩阵快速幂)
[题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个2xN的长条形 ...
- HDU - 2604 Queuing(递推式+矩阵快速幂)
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 5950 Recursive sequence 递推式 矩阵快速幂
题目链接 题意 给定\(c_0,c_1,求c_n(c_0,c_1,n\lt 2^{31})\),递推公式为 \[c_i=c_{i-1}+2c_{i-2}+i^4\] 思路 参考 将递推式改写\[\be ...
- [题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化
这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你 ...
- HDU-6185-Covering(推递推式+矩阵快速幂)
Covering Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 6185 递推+【矩阵快速幂】
<题目链接> <转载于 >>> > 题目大意: 让你用1*2规格的地毯去铺4*n规格的地面,告诉你n,问有多少种不同的方案使得地面恰好被铺满且地毯不重叠.答案 ...
- 【图灵杯 F】一道简单的递推题(矩阵快速幂,乘法模板)
Description 存在如下递推式: F(n+1)=A1*F(n)+A2*F(n-1)+-+An*F(1) F(n+2)=A1*F(n+1)+A2*F(n)+-+An*F(2) - 求第K项的值对 ...
随机推荐
- 快速开启MySQL慢日志查询的方法
MySQL慢日志查询对于很多刚接触MySQL数据的新人来说比较陌生,下面就为您介绍MySQL慢日志查询的用法和好处,供您参考. mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是 ...
- String、String Buffer、String Builder
对于String.String Buffer.String Builder:我一直都只知道String是字符串常量,后两者是字符串变量: String和String Buffer是线程安全的,Stri ...
- 韦东山笔记之安装arm-linux-gcc交叉编译环境详细步骤。
1在关盘主目录tools下复制arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2到虚拟机上 解压 tar xjf arm-linux-gcc-3.4.5-glibc ...
- ABAP数据类型
数据类型表: 类型缩写 类型 默认长度 允许长度 初始值 描述 C 文本型 1 Space 字符串数据,如'Program' D 日期型 8 8 '00000000' 日期数据,格式为YYYYMM ...
- [拾零]C/C++_代码复用的实现_静态链接库_动态链接库_使用.def导出
1 静态链接库 1.1 创建静态链接库: 1.在VC6中创建项目:Win32 Static Library 2.在项目中创建两个文件:xxx.h 和 xxx.cpp 3.编译 1.2 使用静态链接库 ...
- 小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载三(通过实例来体验生命周期)
4.1.2 通过实例来亲身体验Activity的生命周期 上一小节介绍了Activity生命周期中的各个过程,本小节将以一个简单的实例来使读者亲身体验到Activity生命周期中的各个事件. 在Ec ...
- python基础教程总结3—字典
1.字典 1.1 字典类型与序列类型的区别: 存取和访问数据的方式不同. 序列类型只用数字类型的键(从序列的开始按数值顺序索引): 映射类型可以用其他对象类型作键(如:数字.字符串.元祖,一般用字符串 ...
- Android(java)学习笔记117:SharedPreferences(轻量级存储类)
1.SharedPreferences是Android平台上一个轻量级的存储类,简单的说就是可以存储一些我们需要的变量信息.2个activity 之间的数据传递除了可以他通过intent来传递数据,还 ...
- java基础—equals方法
一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test; 2 3 public class TestEquals { 4 public s ...
- java基础—流
一.JAVA流式输入/输出原理