一道递推题目

得到递推关系为  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的更多相关文章

  1. hdu---(2604)Queuing(矩阵快速幂)

    Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  2. 【递推+矩阵快速幂】【HDU2604】【Queuing】

    Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  3. [HDU2604]Queuing

    题目:Queuing 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604 分析: 1)将当前格和上一格合并当作一个状态,考虑下一个格子放0(m)还是1( ...

  4. HDU2604—Queuing

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604 题目意思:n个人排队,f表示女,m表示男,包含子串‘fmf’和‘fff’的序列为O队列,否则为E ...

  5. HDU2604 Queuing 矩阵初识

    Queues and Priority Queues are data structures which are known to most computer scientists. The Queu ...

  6. HDU2604:Queuing(矩阵快速幂+递推)

    传送门 题意 长为len的字符串只由'f','m'构成,有2^len种情况,问在其中不包含'fmf','fff'的字符串有多少个,此处将队列换成字符串 分析 矩阵快速幂写的比较崩,手生了,多练! 用f ...

  7. hdu2604(递推,矩阵快速幂)

    题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...

  8. HDU2045/*HDU2604/*HDU2501/HDU2190 递推

    不容易系列之(3)-- LELE的RPG难题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  9. Message Queuing(MSMQ)

    一.前言 MicroSoft Message Queuing(微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任 ...

随机推荐

  1. Javaweb学习笔记——(四)——————JavaScript基础&DOM目录

    1.案例一:在末尾添加节点 第一个:获取到ul标签 第二部:创建li标签 document.createElement("标签名称")方法 第三步:创建文本 document.cr ...

  2. 使用eclipse创建web项目的项目图文步骤

    在eclipse中使用maven ① maven插件:eclipse内置 ②maven插件的设置: [1]installations:指定maven核心程序的位置,不建议使用自带的maven程序而应该 ...

  3. C# Regex正则常用方法的使用

    using System; using System.Collections; using System.Configuration; using System.Data; using System. ...

  4. 日期与时间控件QDate, QTime, QDateTime

    QDate类用于处理公历日期.QTime类用于处理时间.QDateTime类将QDate对象和QTime对象整合为一个对象 QDate: from PyQt5.QtCore import QDate, ...

  5. 自己对Java的一些认识

    作为一个理论性比较强的学生,谈一下这段时间对java以及对程序设计的理解 java相对于其它语言有几个特点,一个是面向对象,一个是强类型          首先谈谈面向对象,关于类和对象,这个一定要有 ...

  6. 模板·点分治(luogu P3806)

    [模板]洛谷·点分治 1.求树的重心 树的重心:若A点的子树中最大的子树的size[] 最小时,A为该树的中心 步骤: 所需变量:siz[x] 表示 x 的子树大小(含自己),msz[x] 表示 其子 ...

  7. java先导课程学习总结

    经过两个星期四节课的java学习,我也对java这门语言有了一定的认识.刚开始上课的时候,我认为java把C语言中老师所说的模块化编程进行了强调,进行一个类,一个类的编程,在类中构造相应的方法,使用的 ...

  8. Mybatis的分页插件PageHelper分页失效的原因

    引用博客:个人博客地址:https://alexaccele.github.io/ PageHelper是Mybatis的一个很好的分页插件,但要使用它的分页功能需要注意一下几点 1.导入相关包,例如 ...

  9. Java InputStream 、 InputStreamReader和BufferedReader

    https://blog.csdn.net/zgljl2012/article/details/47267609 在Java中,上述三个类经常用于处理数据流,下面介绍一下三个类的不同之处以及各自的用法 ...

  10. Python startswith() 函数 判断字符串开头

    Python startswith() 函数 判断字符串开头 函数:startswith() 作用:判断字符串是否以指定字符或子字符串开头 一.函数说明语法:string.startswith(str ...