ICPC 沈阳站C题 HDU 5950 Recursive sequence 矩阵快速幂 线性递推
2016-11-04 17:41
591 查看
http://acm.hdu.edu.cn/showproblem.php?pid=5950
给出前两项a,b,关系式 f[i] = f[i-1] + f[i-2] * 2 + i^4,问第n项是多少(对2147493647取模), n,a,b < 2^31
矩阵,维护f[i], f[i-1], i^4, i^3,i^2,i还有一个常数1,得到七维矩阵,以为开始有两项,i = 2,所以也得到初始的1*7矩阵
哎,一开始写矩阵乘法累加变赋值了...半天没发现
231
给出前两项a,b,关系式 f[i] = f[i-1] + f[i-2] * 2 + i^4,问第n项是多少(对2147493647取模), n,a,b < 2^31
矩阵,维护f[i], f[i-1], i^4, i^3,i^2,i还有一个常数1,得到七维矩阵,以为开始有两项,i = 2,所以也得到初始的1*7矩阵
// // main.cpp // 5950 Recursive sequence 矩阵快速幂 线性递推 // // Created by czf on 2016/11/3. // Copyright © 2016年 czf. All rights reserved. // #include <cstdio> #include <cstring> typedef long long LL; const int SIZE = 7; const LL MOD = 2147493647; struct Mat { LL a[SIZE][SIZE]; void setOne() { memset(a, 0, sizeof(a)); for (int i = 0; i < SIZE; i ++) a[i][i] = 1; } void setZero() { memset(a, 0, sizeof(a)); } void print() { for (int i = 0; i < SIZE; i ++) { for (int j = 0; j < SIZE; j ++) { printf("%lld%c",a[i][j],j == SIZE-1 ? '\n' : ' '); } } printf("\n"); } Mat operator * (const Mat &rhs) const { Mat ret; ret.setZero(); for (int i = 0; i < SIZE; i ++) { for (int j = 0; j < SIZE; j ++) { for (int k = 0; k < SIZE; k ++) { ret.a[i][j] = (ret.a[i][j] + (a[i][k] % MOD) * (rhs.a[k][j] % MOD) % MOD) % MOD; } } } return ret; } Mat operator ^ (LL n) const { Mat base = (*this), ret; ret.setOne(); while (n) { if (n & 1) ret = ret * base; base = base * base; n >>= 1; } return ret; } }; int main() { int T; scanf("%d",&T); while (T--) { LL n, a, b; scanf("%lld%lld%lld",&n,&a,&b); if (n <= 2) { printf("%lld\n",n == 1 ? a : b); } Mat m1 = { b, a, 16, 8, 4, 2, 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 }; Mat m2 = { 1, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 4, 0, 4, 1, 0, 0, 0, 6, 0, 6, 3, 1, 0, 0, 4, 0, 4, 3, 2, 1, 0, 1, 0, 1, 1, 1, 1, 1 }; m2 = m2 ^ (n-2); m1 = m1 * m2; printf("%lld\n",m1.a[0][0]); } return 0; }
哎,一开始写矩阵乘法累加变赋值了...半天没发现
231
相关文章推荐
- 2016 沈阳 1003 Recursive sequence(hdu 5950)矩阵快速幂
- [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 5950 Recursive sequence(矩阵快速幂,构造)
- HDU 5950 Recursive sequence(矩阵快速幂)
- [矩阵快速幂]HDU 5950 Recursive sequence
- hdu 5950 2016ACM/ICPC沈阳赛区现场赛C题【矩阵快速幂】
- hdu_5950_Recursive sequence(矩阵快速幂)
- hdu 5950 Recursive sequence 2016ACM/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 矩阵快速幂