博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Loj10222 佳佳的Fibonacci(矩阵乘法)
阅读量:5289 次
发布时间:2019-06-14

本文共 1184 字,大约阅读时间需要 3 分钟。

题面

给定\(n,m\),求:

\[ T(n)=\sum_{i=1}^ni\times f_i \]
其中\(f_i\)为斐波那契数列的第\(i\)

题解

不妨设:

\[ S(n)=\sum_{i=1}^nf_i \]
则可以设:
\[ P(n)=nS(n)-T(n)=\sum_{i=1}^{n-1}(n-i)\times f_i \]
所以有:
\[ P(n+1)=\sum_{i=1}^{n}(n+1-i)\times f_i=\sum_{i=1}^n(n-i)\times f_i+\sum_{i=1}^nf_i\\ =\sum_{i=1}^{n-1}(n-i)\times f_i+0\times f_n+S(n)=P(n)+S(n) \]

然后就可以用矩阵乘法加速递推了。

#include 
#include
int n, m;struct Matrix { int a[4][4]; Matrix() { memset(a, 0, sizeof a); } inline int* operator [] (const int &x) { return a[x]; } inline Matrix operator * (Matrix &b) const { Matrix ret; for(int i = 0; i < 4; ++i) for(int k = 0; k < 4; ++k) for(int j = 0; j < 4; ++j) (ret[i][j] += 1ll * a[i][k] * b[k][j] % m) %= m; return ret; }} S, T;int main () { scanf("%d%d", &n, &m); int k = n; S[0][1] = 1; T[0][0] = T[0][1] = T[0][2] = 1; T[1][0] = T[1][2] = 1; T[2][2] = T[2][3] = 1; T[3][3] = 1; while(k) { if(k & 1) S = S * T; T = T * T, k >>= 1; } printf("%lld\n", (1ll * n * S[0][2] % m + m - S[0][3]) % m); return 0;}

转载于:https://www.cnblogs.com/water-mi/p/9879289.html

你可能感兴趣的文章
kafka 调参笔记
查看>>
Java周总结1
查看>>
第五周课程总结&实验报告(三)
查看>>
第四周课程总结&试验报告(二)
查看>>
第六周课程总结&试验报告(四)
查看>>
Java周总结3
查看>>
Flink Maven项目兼容多版本Kafka
查看>>
flink1.9新特性:维表Join解读
查看>>
Blink源码编译
查看>>
网易Java进阶知识图谱
查看>>
React 的setState 理解
查看>>
Redux 中间件和异步操作
查看>>
Redux 核心概念
查看>>
React Children 使用
查看>>
Redux 和React 结合
查看>>
Jest 单元测试入门
查看>>
React Context API
查看>>
js笔记
查看>>
浅析乐观锁与悲观锁
查看>>
PHP实现Redis单据锁,防止并发重复写入
查看>>