AcWing1303. 斐波那契前 n 项和(递推/矩阵快速幂)

大家都知道 Fibonacci 数列吧,f1=1,f2=1,f3=2,f4=3,…,fn=fn−1+fn−2。

现在问题很简单,输入 n 和 m,求 fn 的前 n 项和 Snmodm。

输入格式

共一行,包含两个整数 n 和 m。

输出格式

输出前 n 项和 Snmodm 的值。

数据范围

1≤n≤2000000000,
1≤m≤1000000010

输入样例:

5 1000

输出样例:

12

矩阵快速幂板子题。设前n项和为Sn,有SnSn1=fn=fn1+fn2=Sn1Sn2+Sn2Sn3,得到Sn=2×Sn1Sn3,显然转移矩阵为:

2 0 -1

1 0 0

0 1 0

搞一搞就行了

注意转移矩阵有减法,在进行矩阵乘法的时候注意多加几个mod防爆!!!

#include <bits/stdc++.h>
#define LL long long
using namespace std;
#define int long long
#define N 3
struct Mat
{
    LL m[101][101];
    void print() {
    	for(int i = 1; i <= N; i++) {
    		for(int j = 1; j <= N; j++) {
    			cout << m[i][j] << " ";
    		}
    		cout << endl;
    	}
    }
};//存储结构体
Mat a,e; //a是输入的矩阵,e是输出的矩阵
Mat Mul(Mat x,Mat y, long long mod)
{
    Mat c;
    for(int i=1;i<=N;++i){
        for(int j=1;j<=N;++j){
            c.m[i][j] = 0;
        }
    }
    for(int i=1;i<=N;++i){
        for(int j=1;j<=N;++j){
            for(int k=1;k<=N;++k){
                c.m[i][j] = (c.m[i][j]%mod + x.m[i][k]%mod*y.m[k][j]%mod + mod + mod) % mod;//注意有减法!!得多加mod 要不然就爆了
            }
        }
    }
    return c;
}
Mat pow(Mat x,LL y, long long mod)//矩阵快速幂
{
	for(int i = 1; i <= N; i++) {
		for(int j = 1; j <= N; j++) {
			e.m[i][j] = 0;
		}
	}
	for(int i = 1; i <= N; i++) {
		e.m[i][i] = 1;
	}
    Mat ans = e;
    while(y){
        if(y&1) ans = Mul(ans,x,mod);
        x = Mul(x,x,mod);
        y>>=1;
    }
    return ans;
}
long long n, m;
signed main() {
	cin >> n >> m;
	Mat base;
	for(int i = 1; i <= 3; i++) {
		for(int j = 1; j <= 3; j++) {
			base.m[i][j] = 0;
		}
	}
	base.m[1][1] = 2, base.m[1][3] = -1, base.m[2][1] = 1, base.m[3][2] = 1;
	//base.print();
	Mat S;
	for(int i = 1; i <= 3; i++) {
		for(int j = 1; j <= 3; j++) {
			S.m[i][j] = 0;
		}
	}
	S.m[1][1] = 4, S.m[2][1] = 2, S.m[3][1] = 1;
	if(n == 1) cout << 1;
	else if(n == 2) cout << 2;
	else if(n == 3) cout << 4;
	else {
		Mat tmp = pow(base, n - 3, m);
		Mat ans = Mul(tmp, S, m);
		cout << ans.m[1][1];
	}
	return 0;
}
posted @   脂环  阅读(186)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2020-07-10 洛谷P2872 [USACO07DEC]Building Roads S(最小生成树)
2020-07-10 卸载重装VirtualBox回滚报错
2020-07-10 POJ1151 Atlantis(扫描线+线段树+离散化)
点击右上角即可分享
微信分享提示
主题色彩