Queuing HDU2604
一道递推题目
得到递推关系为 f[n]=f[n-1]+f[n-3]+f[n-4];
用普通的枚举算法会超时
所以要用矩阵快速幂来加速
转化为矩阵即为:
+
1 0 1 1 F(N-1) F(N)
1 0 0 0 * F(N-2) = F(N-1)
0 1 0 0 F(N-3) F(N-2)
0 0 1 0 F(N-4) F(N-3)
1 0 1 1(n-4) F(4) F(N)
1 0 0 0 * F(3) = F(N-1)
0 1 0 0 F(2) F(N-2)
0 0 1 0 F(1) F(N-3)
所以f(n) 为 矩阵的n-4次幂 的第一行 与已知的相乘 (n-4 为 n-3-1即可 这是差值 再加一为个数)
#include<iostream>
#include<cstdio>
#include<cstring> using namespace std; int n,k; int q[]={,,,,};
struct matrix{
int arr[][];
}; matrix multi( matrix a,matrix b )
{
matrix c;
for(int i=;i<;i++)
for(int j=;j<;j++){
c.arr[i][j]=;
for(int w=;w<;w++)
c.arr[i][j]=(c.arr[i][j]+a.arr[i][w]*b.arr[w][j]%k)%k;
}
return c;
} int fast(matrix a,int x){
matrix ans;
memset(ans.arr,,sizeof(ans.arr));
for(int i=;i<;i++)ans.arr[i][i]=; while(x){
if(x&){
ans=multi(ans,a);
}
x>>=;
a=multi(a,a);
}
int sum=;
for(int i=;i<;i++)
{
sum+=ans.arr[][i]*q[-i];
sum%=k;
}
return sum;
} int main(){ while(scanf("%d%d",&n,&k)==)
{
if(n<=){printf("%d\n",q[n]%k);continue;}
else
{
matrix a={,,,,,,,,,,,,,,,};
printf("%d\n",fast(a,n-)%k);
}
}
return ;
}
矩阵还是用结构体写方便。
Queuing HDU2604的更多相关文章
- hdu---(2604)Queuing(矩阵快速幂)
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 【递推+矩阵快速幂】【HDU2604】【Queuing】
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- [HDU2604]Queuing
题目:Queuing 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604 分析: 1)将当前格和上一格合并当作一个状态,考虑下一个格子放0(m)还是1( ...
- HDU2604—Queuing
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604 题目意思:n个人排队,f表示女,m表示男,包含子串‘fmf’和‘fff’的序列为O队列,否则为E ...
- HDU2604 Queuing 矩阵初识
Queues and Priority Queues are data structures which are known to most computer scientists. The Queu ...
- HDU2604:Queuing(矩阵快速幂+递推)
传送门 题意 长为len的字符串只由'f','m'构成,有2^len种情况,问在其中不包含'fmf','fff'的字符串有多少个,此处将队列换成字符串 分析 矩阵快速幂写的比较崩,手生了,多练! 用f ...
- hdu2604(递推,矩阵快速幂)
题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...
- HDU2045/*HDU2604/*HDU2501/HDU2190 递推
不容易系列之(3)-- LELE的RPG难题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
- Message Queuing(MSMQ)
一.前言 MicroSoft Message Queuing(微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任 ...
随机推荐
- String类型的方法总结
String :字符串对象的包装类型 var stringObject = new String("wanglehui"); 方法总结: 1.返回该对象表示的基本字符串值(也就是返 ...
- BZOJ3527 [Zjoi2014]力 【fft】
题目 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. 输入格式 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. 输出格式 n行,第i行输出Ei.与标准答案误差不超过 ...
- python 入门基础24 元类、单例模式
内容目录: 一.元类 二.单例模式 一.元类 1 什么是元类: 源自一句话:在python中,一切皆对象,而对象都是由类实例化得到的 class OldboyTeacher: def __init__ ...
- jquery插件模式开发和react组件开发之间的异同
jquery插件模式开发和react组件开发之间的异同
- BFGS算法(转载)
转载链接:http://blog.csdn.net/itplus/article/details/21897443 这里,式(2.38)暂时不知如何证出来,有哪位知道麻烦给个思路.
- Linux 进程中 Stop, Park, Freeze【转】
转自:https://blog.csdn.net/yiyeguzhou100/article/details/53134743 http://kernel.meizu.com/linux-proces ...
- FarBox--另类有趣的网站服务【转】
FarBox--另类有趣的网站服务 转自:http://mosir.org/html/y2012/the-interesting-web-service-serve-by-FarBox.html 作者 ...
- Ubuntu/Debian apt-get 404 Not Found Package Repository Errors,无法找到包的错误
最简单最常用的方法是,使用如下命令更新到新的版本: sudo apt-get dist-upgrade 但是这个方法有时候不一定能起作用,那么可以使用以下直接替换的命令: sudo sed -i -e ...
- 通过全备+relaylog同步恢复被drop的库或表
MySQL 中drop 等高危误操作后恢复方法 实验目的: 本次实验以恢复drop操作为例,使用不同方法进行误操作的数据恢复. 方法: 利用master同步 伪master+Binlog+同步 利用b ...
- Python3学习笔记13-函数的参数
定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数, 以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了 ...