2016 沈阳 1003 Recursive sequence(hdu 5950)矩阵快速幂
来源:互联网 发布:mysql 控制台输出 编辑:程序博客网 时间:2024/05/16 04:41
题意:
给出f[1]=a;f[2]=b;f[n]=f[n-1]+2*f[n-2]+i*i*i*i;问f[n]对2147493647取模的值,n的范围到2的31次。
思路:
由于n的范围过大,必须要用矩阵快速幂求解。难点在于构造矩阵。一开始我的想法是把i的四次分别用(i-1)的四次、三次、二次、一次、零次表示,来构造矩阵,结果一直错,后来看了网上有人是把i+1的四次用i来表示来构造的矩阵,于是我换了下矩阵,就过了,至今不明白原来构造的矩阵为什么就不行。
矩阵如下:
ps: 2147493647记得用 unsigned int,别问我为什么知道QAQ
代码:
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const unsigned int mod=2147493647;struct p{ long long x[8][8];} u, o;void init(long long r[][10], long long y[][10]){ int i, j; for(i=0; i<=6; i++) { for(j=0; j<=6; j++) { u.x[i][j]=y[i][j]; } } for(i=0; i<=6; i++) { for(j=0; j<=6; j++) { o.x[i][j]=r[i][j]; } }}p multi(p a, p b){ int i, j, k; p c; for(i=0; i<7; i++) { for(j=0; j<7; j++) { long long sum=0; for(k=0; k<=6; k++) { sum=(sum+(a.x[i][k]*b.x[k][j])%mod)%mod; } c.x[i][j]=sum; } } return c;}p rec_quickmod(p a, int n){ p b; memset(b.x, 0, sizeof(b.x)); int i, j; for(i=0; i<=6; i++)b.x[i][i]=1; while(n) { if(n%2)b=multi(b,a); n/=2; a=multi(a,a); } return b;}int main(){ int t; scanf("%d",&t); int i, j; long long x[8][10]= {{1,1,0,0,0,0,0}, {2,0,0,0,0,0,0}, {1,0,1,0,0,0,0}, {0,0,4,1,0,0,0}, {0,0,6,3,1,0,0}, {0,0,4,3,2,1,0},{0,0,1,1,1,1,1}}; long long y[8][10]= {{0,0,81,27,9,3,1}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}}; while(t--) { int n; long long a, b; scanf("%d%lld%lld", &n, &a, &b); if(n==1){printf("%lld\n", a);continue;} if(n==2){printf("%lld\n", b);continue;} y[0][0]=b; y[0][1]=a; init(x, y); p c=rec_quickmod(o,n-2); p ans=multi(u,c);// for(i=0; i<7; i++)// {// for(j=0; j<7; j++)// {// printf("%lld ", ans.x[i][j]);// }// printf("\n");// } printf("%lld\n", ans.x[0][0]); } return 0;}
0 0
- 2016 沈阳 1003 Recursive sequence(hdu 5950)矩阵快速幂
- HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)
- ICPC 沈阳站C题 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(构造矩阵+矩阵幂)——2016ACM/ICPC亚洲区沈阳站
- 2016 沈阳区域赛第三题(Recursive sequence)(矩阵快速幂)
- 2016ACM/ICPC亚洲区沈阳站 C 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 5950】【构造矩阵+矩阵幂】 Recursive sequence——2016ACM/ICPC亚洲区沈阳站(重现赛)
- Fuel 9.0安装Openstack网络验证失败解决
- 关于mysql字段名和保留字冲突的问题
- [计网] C++ socket 实现miniFTP
- 蚂蚁之死
- Hadoop单机本地模式
- 2016 沈阳 1003 Recursive sequence(hdu 5950)矩阵快速幂
- 开篇
- 硬盘的存储原理和内部架构
- c++
- c语言优缺点的简单讲解
- android mvc模式再学习
- 《React-Native系列》40、 ReactNative之bundle文件瘦身
- winform 异常
- 一个比较简洁的Promise包装