斐波那契前 n 项和 - 矩阵乘法快速幂

本文介绍了一种使用矩阵快速幂的方法来计算斐波那契数列前n项和的C++代码实现,通过构造特定矩阵A并利用递归操作实现高效计算。
摘要由CSDN通过智能技术生成

1303. 斐波那契前 n 项和 - AcWing题库

F_{i}=[f_{i},f_{i+1},S_{i}]

F_{i+1}=[f_{i+1},f_{i+2},S_{i+1}]

构造矩阵A使F_{i}*A=F_{i + 1}

                              0        1        0

 A        =          [      1        1        1        ]

                              0        0        1

F_{n}=F_{1}*A^{n-1}

然后对这个式子进行快速幂,挺神奇的

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
 
using namespace std;
 
typedef pair<int, int> PII;
typedef long long ll;
typedef long double ld;
 
const int N = 3;
 
int n, mod;
 
void mul(int C[], int A[], int B[][N])
{
	int tmp[N] = {0};
	//因为就一行所以没有i,相当于for(int i=0;i<1;i++)
	for(int j = 0; j < N; j ++)
		for(int k = 0; k < N; k ++)
			tmp[j] = (tmp[j] + (ll)A[k] * B[k][j]) % mod;
		
	memcpy(C, tmp, sizeof tmp);
}
 
void mul(int C[][N], int A[][N], int B[][N])
{
	int tmp[N][N] = {0};
	
	for(int i = 0; i < N; i ++)
		for(int j = 0; j < N; j ++)
			for(int k = 0; k < N; k ++)
				tmp[i][j] = (tmp[i][j] + (ll)A[i][k] * B[k][j]) % mod;
				
	memcpy(C, tmp, sizeof tmp);
}
 
int main()
{
	IOS
	int f1[N] = {1, 1, 1};
	int A[N][N] = {{0, 1, 0}, {1, 1, 1}, {0, 0, 1}};
	
	cin >> n >> mod;
	int k = n - 1;
	while(k)
	{
		if(k & 1)mul(f1, f1, A);//f1 = f1 * A 
		mul(A, A, A);//A = A * A
		k >>= 1;
	}
	
	cout << f1[2];
	
	
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值