Recursive sequence——(hdu5950)_(矩阵快速幂)
来源:互联网 发布:nginx的server配置 编辑:程序博客网 时间:2024/06/04 18:11
题目:点击打开链接
题意:
F(1)=a,F(2)=b,F(N)=2F(N-2)+F(N-1)+N^4
给你N,a,b(N,a,b < 2^31)
求F(N)%2147493647
分析:
如果递推式是F(N)=2F(N-2)+F(N-1)就方便了许多,基本的矩阵快速幂
但是多了n^4;
这时,又产生了i^3,i^2,i这些新项需要我们计算
由推出的这些东西 我们就可以构造矩阵了
|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 <bits/stdc++.h>using namespace std;typedef long long ll;const ll mod=2147493647;int 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 mul(matrix A,matrix B){ matrix ans; memset(ans.m,0,sizeof(ans.m)); for(int i=0; i<7; i++) { for(int j=0; j<7; j++) { for(int k=0; k<7; k++) { ans.m[i][j]=(ans.m[i][j]+A.m[i][k]*B.m[k][j]%mod)%mod; } } } return ans;}matrix pow(matrix A, ll p){ matrix res; memset(res.m,0,sizeof(res.m)); for(int i=0; i<7; i++) res.m[i][i]=1; while(p) { //cout<<"___"<<endl; if(p&1) res=mul(res,A); p>>=1; A=mul(A,A); } return res;}int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&a,&b); if(n==1) printf("%lld\n",a%mod); else if(n==2) printf("%lld\n",b%mod); else { matrix ans,x; ans.init1(); x.init2(); x=pow(x,n-1); ans=mul(x,ans); printf("%lld\n",ans.m[1][0]); } } return 0;}
阅读全文
0 0
- Recursive sequence——(hdu5950)_(矩阵快速幂)
- (矩阵快速幂)hdu5950 Recursive sequence
- HDU5950 Recursive sequence —— 矩阵快速幂
- HDU5950 Recursive sequence(矩阵快速幂)
- hdu5950 Recursive sequence(矩阵快速幂:模板类题目,矩阵快速幂的扩展与学习,复习必看题目)
- HDU5950(矩阵快速幂)
- HDU5950(矩阵快速幂)
- HDU 5950 Recursive sequence(矩阵构造+矩阵快速幂)
- HDU 5950 Recursive sequence(矩阵快速幂)
- hdu 5950 Recursive sequence(矩阵快速幂,构造)
- HDU 5950 Recursive sequence(矩阵快速幂)
- HDU 5950 Recursive sequence(矩阵快速幂)
- HDU 5950 Recursive sequence(矩阵快速幂)
- hdu 5950 Recursive sequence (矩阵快速幂)
- hdu 1590(Recursive sequence)矩阵快速幂
- HDU5950【矩阵快速幂】
- hdu5950 矩阵快速幂
- 【HDU5950 2016ACM ICPC亚洲区沈阳站-重现赛 C】【矩阵快速幂】Recursive sequence 矩阵递推 i ^ 4
- 用户金字塔模型详解及在实际运营工作中的意义
- 第4周项目6-多项式求和
- 如何跟各种人解释什么是产品经理
- 各种数据源的配置,及对应jar包的引用
- Hadoop集群初步使用-编写wordcount程序
- Recursive sequence——(hdu5950)_(矩阵快速幂)
- Python源码目录
- 复习总结
- 数组去重多解法
- 使用 Azure CLI 2.0 从自定义磁盘创建 Linux VM
- 什么叫对数据敏感?怎样做数据分析?
- Linux spi驱动分析----SPI设备驱动(W25Q32BV)
- SpringBoot注解整理
- Android Studio生成函数注释