博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
武大网赛预赛 Problem 1540 - D - Fibonacci
阅读量:2496 次
发布时间:2019-05-11

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

http://acm.whu.edu.cn/land/problem/detail?problem_id=1540

一道很简单的矩阵模版题,没有解出来真是打脸...

要你求斐波那契数列的每一项的三次方的前n项和。

解题思路:

要你求的是Sn 那么Sn = Sn-1 + Fx-1 ^ 3

(三个公式准备:

斐波那契数的Fx = Fx-1 + Fx-2

立方和公式 w^3 = (x + y)^3 = x^3 + 3x^2*y + 3x*y^2 + y^3;

平方和公式w^2 = (x + y)^2 = x^2 + 2*xy + y^2;)

构造一个矩阵,第一行的有5个项,分别是 Fn^3、Fn^2*Fn-1、Fn*Fn-1^2、Fn-1^3、Sn-1

Fn+1^3、Fn+1^2*Fn、Fn+1*Fn^2、Fn^3、Sn的情况。

然后就是利用三个公式凑出矩阵。

得到的矩阵就是

1 1 1 1 1

3 2 1 0 0

3 1 0 0 0

1 0 0 0 0

0 0 0 0 1)

然后看一下代码吧:

#include 
#include
using namespace std;typedef long long ll;const int maxn = 5;const ll mod = 1000000007;struct Mat{ ll m[maxn][maxn]; void initRight() { m[0][0] = m[0][1] = m[0][2] = m[0][3] = m[0][4] = 1; m[1][0] = 3, m[1][1] = 2, m[1][2] = 1; m[2][0] = 3, m[2][1] = 1; m[3][0] = 1; m[4][4] = 1; } void initLeft() { m[0][0] = m[0][1] = m[0][2] = m[0][3] = m[0][4] = 1; } Mat() { for(int i = 0; i < maxn; i++) for(int j = 0; j < maxn; j++) m[i][j] = 0; } void zero() { for(int i = 0; i < maxn; i++) for(int j = 0; j < maxn; j++) m[i][j] = 0; } void one() { for(int i = 0; i < maxn; i++) for(int j = 0; j < maxn; j++){ m[i][j] = 0; if(i == j) m[i][j] = 1; } } Mat &operator = (const Mat &rhs) { for(int i = 0; i < maxn; i++) for(int j = 0; j < maxn; j++) m[i][j] = rhs.m[i][j]; return *this; } Mat operator * (const Mat &rhs) { Mat mat; mat.zero(); for(int i = 0; i < maxn; i++) for(int j = 0; j < maxn; j++) for(int k = 0; k < maxn; k++) mat.m[i][j] = (mat.m[i][j] + m[i][k]*rhs.m[k][j])%mod; return mat; } Mat operator ^ (const int &mi) { Mat ret, a; int b = mi; ret.one(); a = *this; while(b) { if(b & 1) ret = ret*a; a = a*a; b >>= 1; } return ret; }};int main(){// freopen("data.in", "r", stdin); int n; Mat l, r, res; while(scanf("%d", &n) != EOF && n != 0) { l.zero(); r.zero(); l.initLeft(); r.initRight(); res = l * (r^(n-1)); printf("%lld\n", res.m[0][4]); } return 0;}

转载地址:http://lbhrb.baihongyu.com/

你可能感兴趣的文章
学习笔记_vnpy实战培训day03
查看>>
VNPY- VnTrader基本使用
查看>>
VNPY - CTA策略模块策略开发
查看>>
VNPY - 事件引擎
查看>>
MongoDB基本语法和操作入门
查看>>
学习笔记_vnpy实战培训day04_作业
查看>>
OCO订单(委托)
查看>>
学习笔记_vnpy实战培训day06
查看>>
回测引擎代码分析流程图
查看>>
Excel 如何制作时间轴
查看>>
股票网格交易策略
查看>>
matplotlib绘图跳过时间段的处理方案
查看>>
vnpy学习_04回测评价指标的缺陷
查看>>
ubuntu终端一次多条命令方法和区别
查看>>
python之偏函数
查看>>
vnpy学习_06回测结果可视化改进
查看>>
读书笔记_量化交易如何建立自己的算法交易01
查看>>
设计模式03_工厂
查看>>
设计模式04_抽象工厂
查看>>
设计模式05_单例
查看>>