HDU5950(矩阵快速幂)
来源:互联网 发布:如何设置子域名 编辑:程序博客网 时间:2024/06/04 21:00
转载:自己看方便
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950
题意:f(n) = f(n-1) + 2*f(n-2) + n^4,f(1) = a , f(2) = b,求f(n)
思路:对矩阵快速幂的了解仅仅停留在fib上,重现赛自己随便乱推还一直算错,快两个小时才a还wa了好几次....
主要就是构造矩阵:(n+1)^4 = n^4 + 4n^3 + 6n^2 + 4n + 1
|1 2 1 4 6 4 1| | f(n+1) | | f(n+2) |
|1 0 0 0 0 0 0| | f(n) | | f(n+1) |
|0 0 1 4 6 4 1| | (n+1)^4 | | (n+2)^4 |
|0 0 0 1 3 3 1| * | (n+1)^3 | = | (n+2)^3 |
|0 0 0 0 1 2 1| | (n+1)^2 | | (n+2)^2 |
|0 0 0 0 0 1 1| | n+1 | | n+2 |
|0 0 0 0 0 0 1| | 1 | | 1 |
#include<cstdio>using namespace std;typedef long long ll;const ll mod = 2147493647;ll n,a,b;struct Matrix{ ll m[7][7]; void init1() { m[0][0] = b,m[0][1] = 0,m[0][2] = 0,m[0][3] = 0,m[0][4] = 0,m[0][5] = 0,m[0][6] = 0; m[1][0] = a,m[1][1] = 0,m[1][2] = 0,m[1][3] = 0,m[1][4] = 0,m[1][5] = 0,m[1][6] = 0; m[2][0] = 16,m[2][1] = 0,m[2][2] = 0,m[2][3] = 0,m[2][4] = 0,m[2][5] = 0,m[2][6] = 0; m[3][0] = 8,m[3][1] = 0,m[3][2] = 0,m[3][3] = 0,m[3][4] = 0,m[3][5] = 0,m[3][6] = 0; m[4][0] = 4,m[4][1] = 0,m[4][2] = 0,m[4][3] = 0,m[4][4] = 0,m[4][5] = 0,m[4][6] = 0; m[5][0] = 2,m[5][1] = 0,m[5][2] = 0,m[5][3] = 0,m[5][4] = 0,m[5][5] = 0,m[5][6] = 0; m[6][0] = 1,m[6][1] = 0,m[6][2] = 0,m[6][3] = 0,m[6][4] = 0,m[6][5] = 0,m[6][6] = 0; } void init2() { m[0][0] = 1,m[0][1] = 2,m[0][2] = 1,m[0][3] = 4,m[0][4] = 6,m[0][5] = 4,m[0][6] = 1; m[1][0] = 1,m[1][1] = 0,m[1][2] = 0,m[1][3] = 0,m[1][4] = 0,m[1][5] = 0,m[1][6] = 0; m[2][0] = 0,m[2][1] = 0,m[2][2] = 1,m[2][3] = 4,m[2][4] = 6,m[2][5] = 4,m[2][6] = 1; m[3][0] = 0,m[3][1] = 0,m[3][2] = 0,m[3][3] = 1,m[3][4] = 3,m[3][5] = 3,m[3][6] = 1; m[4][0] = 0,m[4][1] = 0,m[4][2] = 0,m[4][3] = 0,m[4][4] = 1,m[4][5] = 2,m[4][6] = 1; m[5][0] = 0,m[5][1] = 0,m[5][2] = 0,m[5][3] = 0,m[5][4] = 0,m[5][5] = 1,m[5][6] = 1; m[6][0] = 0,m[6][1] = 0,m[6][2] = 0,m[6][3] = 0,m[6][4] = 0,m[6][5] = 0,m[6][6] = 1; } Matrix operator * (Matrix t) { Matrix res; for (int i = 0; i < 7; i++) { for (int j = 0; j < 7; j++) { res.m[i][j] = 0; for (int k = 0;k < 7; k++) res.m[i][j] = (res.m[i][j] + (m[i][k] % mod) * (t.m[k][j] % mod) % mod) % mod; } } return res; } Matrix operator ^ (int k) { Matrix res,s; res.init2(); s.init2(); while(k) { if(k & 1) res = res * s; k >>= 1; s = s * s; } return res; }};int main(){ int T; scanf("%d",&T); while(T--) { scanf("%lld %lld %lld",&n,&a,&b); if(n == 1) { printf("%lld\n",a % mod); continue; } if(n == 2) { printf("%lld\n",b % mod); continue; } Matrix ans,t; ans.init1(); t.init2(); ans = (t^(n-3)) * ans; printf("%lld\n",ans.m[0][0]); } return 0;}
- HDU5950(矩阵快速幂)
- HDU5950(矩阵快速幂)
- HDU5950【矩阵快速幂】
- hdu5950 矩阵快速幂
- (矩阵快速幂)hdu5950 Recursive sequence
- 矩阵构造+矩阵快速幂-HDU5950
- hdu5950(递推的矩阵快速幂)
- HDU5950 Recursive sequence(矩阵快速幂)
- Recursive sequence——(hdu5950)_(矩阵快速幂)
- HDU5950 Recursive sequence —— 矩阵快速幂
- hdu5950(递推+矩阵快速幂函) 2016亚洲区域赛沈阳站C题(铜牌题)
- hdu5950 Recursive sequence(矩阵快速幂:模板类题目,矩阵快速幂的扩展与学习,复习必看题目)
- hdu5950 矩阵dp
- hdu5950 矩阵构造
- 【HDU5950 2016ACM ICPC亚洲区沈阳站-重现赛 C】【矩阵快速幂】Recursive sequence 矩阵递推 i ^ 4
- hdu5950
- HDU5950
- poj3070(矩阵快速幂,矩阵乘法)
- flann中关于indexParam的使用说明
- ppi,dppx,dpr
- usaco Ski Course Design
- SlidingMenu的使用
- Docker Swarm 集群的创建与管理几篇好文章
- HDU5950(矩阵快速幂)
- FMDB数据库升级增加表字段
- C# 使用SqlBulkCopy类批量复制大数据
- 有关Android Studio中多个依赖具有同一引用
- 【51NOD 1674】【51NOD 算法马拉松19】区间的价值 V2
- php-fpm 以user =root group=root 的权限运行
- javascriptDom(五)
- 负载均衡
- CentOS7 Docker环境部署