HDU 2604 Queuing(矩阵高速幂)
题目地址: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(矩阵高速幂)相关推荐
- hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)
http://acm.hdu.edu.cn/showproblem.php?pid=3221 一晚上搞出来这么一道题..Mark. 给出这么一个程序.问funny函数调用了多少次. 我们定义数组为所求 ...
- hdu 5411 CRB and Puzzle 矩阵高速幂
链接 题解链接:http://www.cygmasot.com/index.php/2015/08/20/hdu_5411/ 给定n个点 常数m 以下n行第i行第一个数字表示i点的出边数.后面给出这些 ...
- HDOJ How many ways?? 2157【矩阵高速幂】
How many ways? ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations (矩阵高速幂)
题目地址:http://codeforces.com/contest/551/problem/D 分析下公式能够知道,相当于每一位上放0或者1使得最后成为0或者1.假设最后是0的话,那么全部相邻位一定 ...
- POJ 3613 Cow Relays (floyd + 矩阵高速幂)
题目大意: 求刚好经过K条路的最短路 我们知道假设一个矩阵A[i][j] 表示表示 i-j 是否可达 那么 A*A=B B[i][j] 就表示 i-j 刚好走过两条路的方法数 那么同理 我们把 ...
- hdu 2604 Queuing AC自动机构造递推式-矩阵-结果
http://acm.hdu.edu.cn/showproblem.php?pid=2604 题意: L个人排队,这一队里男性用m表示,女性用f表示,问长度为L的序列里面不包含形如"fmf& ...
- HDU 6185 Covering 矩阵快速幂 递推
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6185 题目描述: 一个4*n的矩形, 你用1*2的矩形覆盖有多少种方案, n <= 1e18 ...
- HDOJ 5411 CRB and Puzzle 矩阵高速幂
直接构造矩阵,最上面一行加一排1.高速幂计算矩阵的m次方,统计第一行的和 CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others) Memory ...
- HDU - 5667 Sequence(矩阵快速幂+费马小定理降幂)
题目链接:点击查看 题目大意:给出函数f(x): 现给出n,a,b,c,mod,求f(n)对mod取模后的结果 题目分析:这个题目相对于前几个题来说稍微加大了点难度,但还是挺水的一个题,首先我们可以对 ...
最新文章
- svpwm矢量控制电机相电压波形_如何深入理解SVPWM?
- UWP Composition API - GroupListView(一)
- java核心技术-jvm基础知识
- 单点登陆(SSO)组件的设计与实现一 【转】
- 有史以来最强的 5G 入门科普!
- 企业中个别机械类制图软件无法打印的问题汇总
- [Hadoop]-Yarn-调度器篇
- 需求:vue+svg实现连线功能
- python人名抽签_办公人员的 python 妙用——抽签结果提取
- Java中使用正则表达式
- 惠普HP Laser MFP 137fnw 一体机驱动
- sqldbx解决中文乱码“????“
- 1147 简单评委打分
- 最新H5网页分享到Twitter、Facebook带缩略图
- 贪心算法(Java)
- 【MCU】单片机看门狗工作原理
- 双线macd指标参数最佳设置_mt5怎么添加双线macd?mt5中macd怎么设置快慢线?
- php class 构造_PHP 类与构造函数解析
- 2022-02-22:机器人大冒险。 力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0)。小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动。指令有两种
- 麦咖啡发布“奶铁”取代拿铁,明年新开1000家店 | 美通社头条
热门文章
- 学习前端开发,那你值得css的特点有哪些?
- 专为前端开发者准备的15款优秀的Sublime Text插件
- 谁说 JavaScript 简单的?
- Linux启动syslog进程,linux – 使用systemd启动的进程正在记录到/ var / log / syslog和/var/log/daemon.log...
- oracle number 7 5,oracle上机练习6-7及答案
- 中专计算机应用完整教学计划,中职生教学计划
- druid监控页面_Spring boot学习(四)Spring boot整合Druid
- layui表格取消横向滚动条_layui滑动条如何隐藏
- cuda 图片拆分_急需,PDF怎么拆分啊?
- linux 添加新的系统调用,如何在Linux中添加新的系统调用