hdu2604 递推转换矩阵快速幂
来源:互联网 发布:内帐软件 编辑:程序博客网 时间:2024/06/03 22:54
刚开始还以为用位运算与或几下几个循环就搞定了,算着算着发现不行........
还是一种固定的切题角度,我假设有长度为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[5];struct mac{ int m[4][4];};mac power(mac x,mac y,int p){ mac temp; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { temp.m[i][j]=0; for(int k=0;k<4;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,0,sizeof(unit.m)); memset(pri.m,0,sizeof(pri.m)); unit.m[0][0]=unit.m[1][1]=unit.m[2][2]=unit.m[3][3]=1; pri.m[0][0]=pri.m[0][2]=pri.m[0][3]=pri.m[1][0]=pri.m[2][1]=pri.m[3][2]=1; while(n) { if(n&1) { unit = power(unit,pri,k); } pri = power(pri,pri,k); n >>= 1; } int ans = (answer[4]*unit.m[0][0]+answer[3]*unit.m[0][1]+answer[2]*unit.m[0][2]+answer[1]*unit.m[0][3])%k; printf("%d\n",ans);}int main(){ int n,k; while(scanf("%d%d",&n,&k)!=EOF) { memset(answer,0,sizeof(answer)); answer[1]=2; answer[2]=4; answer[3]=6; answer[4]=9; if(n<=4) { printf("%d\n",answer[n]%k); } else{ eachother(n-4,k); } } return 0;}
0 0
- hdu2604 递推转换矩阵快速幂
- hdu2604(递推,矩阵快速幂)
- HDU2604-Queuing(递推+矩阵快速幂)
- 【递推+矩阵快速幂】【HDU2604】【Queuing】
- HDU2604 递推关系+矩阵快速幂
- hdu2604 矩阵快速幂
- 快速矩阵幂HDU2604
- hdu2604矩阵快速幂
- HDU2604【矩阵快速幂】
- hdu2604之矩阵快速幂
- hdu2604(矩阵快速幂)
- HDU2604 Queuing(矩阵快速幂)
- [矩阵快速幂]hdu2604 Queuing
- hdu2604 Queuing(矩阵快速幂 + DP)
- HDU2604-- Queuing(矩阵快速幂优化)
- HDU2604 Queuing(矩阵快速幂模板)
- [HDU2604]Queuing(dp+矩阵快速幂)
- 递推+矩阵快速幂
- 关于-[UITableView _configureCellForDisplay:forIndexPath:].....UITableView.m:7962错误的解决
- MediaStore类的使用
- 各种协议的探究
- hdu4489 组合公式+dp
- 简单递推公式转换矩阵求解
- hdu2604 递推转换矩阵快速幂
- hdu4861 我只能说这是找规律=.=
- hdu4864不是一般的贪心
- 15年多校第一场七题hdu5294
- UO的分类描述
- 2015多校训练第二场 hdu5305
- hdu5301
- hdu5319 简单模拟
- SVN常用命令(全)