题目地址:HDU 2604

这题仅仅要推出公式来,构造矩阵就非常easy了。问题是推不出公式来。。TAT。。

从递推的思路考虑。用f(n)表示n个人满足条件的结果。假设最后一个是m则前n-1人能够随意排列,有f(n-1)种;假设是f,则考虑后两位mf和ff,没有一定满足或者一定不满足的状态,所以继续考虑一位,考虑后三位mmf, fmf, mff, fff,当中fmf和fff不符合条件。假设是mmf,则前n-3种能够随意排列,有f(n-3)种。假设是mff。则继续往前考虑一位。假设是fmff不符合条件,假设是mmff。前n-4能够随意排列。有f(n-4)种。
则推出递推公式:f(n)=f(n-1)+f(n-3)+f(n-4);

可是这样递推过去明显会超时,所以须要用矩阵来加速。

然后构造矩阵:

1,0,1,1

1,0,0,0

0,1,0,0

0,0,1,0

求矩阵的k-4次幂。

代码例如以下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>using namespace std;
int mod, a[6]={0,2,4,6,9};
struct matrix
{int ma[5][5];
}init, res;
matrix Mult(matrix x, matrix y)
{matrix tmp;int i, j, k;for(i=0;i<4;i++){for(j=0;j<4;j++){tmp.ma[i][j]=0;for(k=0;k<4;k++){tmp.ma[i][j]=(tmp.ma[i][j]+x.ma[i][k]*y.ma[k][j])%mod;}}}return tmp;
}
matrix Pow(matrix x, int k)
{matrix tmp;int i, j;for(i=0;i<4;i++) for(j=0;j<4;j++) tmp.ma[i][j]=(i==j);while(k){if(k&1) tmp=Mult(tmp,x);x=Mult(x,x);k>>=1;}return tmp;
}
int main()
{int i, j, k;while(scanf("%d%d",&k,&mod)!=EOF){if(k<5){printf("%d\n",a[k]%mod);continue ;}init.ma[0][0]=1;init.ma[0][1]=0;init.ma[0][2]=1;init.ma[0][3]=1;for(i=1;i<4;i++){for(j=0;j<4;j++){init.ma[i][j]=(i==j+1);}}res=Pow(init,k-4);int ans=0;for(i=0;i<4;i++){ans=(ans+res.ma[0][i]*a[4-i])%mod;//printf("%d %d\n",ans,a[4-i]);}printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/cxchanpin/p/6795823.html

HDU 2604 Queuing(矩阵高速幂)相关推荐

  1. hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)

    http://acm.hdu.edu.cn/showproblem.php?pid=3221 一晚上搞出来这么一道题..Mark. 给出这么一个程序.问funny函数调用了多少次. 我们定义数组为所求 ...

  2. hdu 5411 CRB and Puzzle 矩阵高速幂

    链接 题解链接:http://www.cygmasot.com/index.php/2015/08/20/hdu_5411/ 给定n个点 常数m 以下n行第i行第一个数字表示i点的出边数.后面给出这些 ...

  3. HDOJ How many ways?? 2157【矩阵高速幂】

    How many ways? ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations (矩阵高速幂)

    题目地址:http://codeforces.com/contest/551/problem/D 分析下公式能够知道,相当于每一位上放0或者1使得最后成为0或者1.假设最后是0的话,那么全部相邻位一定 ...

  5. POJ 3613 Cow Relays (floyd + 矩阵高速幂)

    题目大意: 求刚好经过K条路的最短路 我们知道假设一个矩阵A[i][j] 表示表示 i-j 是否可达 那么 A*A=B  B[i][j]  就表示   i-j 刚好走过两条路的方法数 那么同理 我们把 ...

  6. hdu 2604 Queuing AC自动机构造递推式-矩阵-结果

    http://acm.hdu.edu.cn/showproblem.php?pid=2604 题意: L个人排队,这一队里男性用m表示,女性用f表示,问长度为L的序列里面不包含形如"fmf& ...

  7. HDU 6185 Covering 矩阵快速幂 递推

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6185 题目描述: 一个4*n的矩形, 你用1*2的矩形覆盖有多少种方案, n <= 1e18 ...

  8. HDOJ 5411 CRB and Puzzle 矩阵高速幂

    直接构造矩阵,最上面一行加一排1.高速幂计算矩阵的m次方,统计第一行的和 CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  9. HDU - 5667 Sequence(矩阵快速幂+费马小定理降幂)

    题目链接:点击查看 题目大意:给出函数f(x): 现给出n,a,b,c,mod,求f(n)对mod取模后的结果 题目分析:这个题目相对于前几个题来说稍微加大了点难度,但还是挺水的一个题,首先我们可以对 ...

最新文章

  1. svpwm矢量控制电机相电压波形_如何深入理解SVPWM?
  2. UWP Composition API - GroupListView(一)
  3. java核心技术-jvm基础知识
  4. 单点登陆(SSO)组件的设计与实现一 【转】
  5. 有史以来最强的 5G 入门科普!
  6. 企业中个别机械类制图软件无法打印的问题汇总
  7. [Hadoop]-Yarn-调度器篇
  8. 需求:vue+svg实现连线功能
  9. python人名抽签_办公人员的 python 妙用——抽签结果提取
  10. Java中使用正则表达式
  11. 惠普HP Laser MFP 137fnw 一体机驱动
  12. sqldbx解决中文乱码“????“
  13. 1147 简单评委打分
  14. 最新H5网页分享到Twitter、Facebook带缩略图
  15. 贪心算法(Java)
  16. 【MCU】单片机看门狗工作原理
  17. 双线macd指标参数最佳设置_mt5怎么添加双线macd?mt5中macd怎么设置快慢线?
  18. php class 构造_PHP 类与构造函数解析
  19. 2022-02-22:机器人大冒险。 力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0)。小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动。指令有两种
  20. 麦咖啡发布“奶铁”取代拿铁,明年新开1000家店 | 美通社头条

热门文章

  1. 学习前端开发,那你值得css的特点有哪些?
  2. 专为前端开发者准备的15款优秀的Sublime Text插件
  3. 谁说 JavaScript 简单的?
  4. Linux启动syslog进程,linux – 使用systemd启动的进程正在记录到/ var / log / syslog和/var/log/daemon.log...
  5. oracle number 7 5,oracle上机练习6-7及答案
  6. 中专计算机应用完整教学计划,中职生教学计划
  7. druid监控页面_Spring boot学习(四)Spring boot整合Druid
  8. layui表格取消横向滚动条_layui滑动条如何隐藏
  9. cuda 图片拆分_急需,PDF怎么拆分啊?
  10. linux 添加新的系统调用,如何在Linux中添加新的系统调用