斐波那契前 n 项和

// 斐波那契前 n 项和.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//


/*

https://www.acwing.com/problem/content/1305/
https://loj.ac/p/10221


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

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

输入格式
共一行,包含两个整数 n 和 m。

输出格式
输出前 n 项和 Sn mod m 的值。

数据范围
1≤n≤2000000000,
1≤m≤1000000010
输入样例:
5 1000
输出样例:
12
*/
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

typedef long long LL;

const int N = 3;
int n, m;


void mul(int c[N][N], int a[N][N], int b[N][N]) {
	static int temp[N][N]; memset(temp, 0, sizeof temp);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			for (int k = 0; k < N; k++) {
				temp[i][j] = temp[i][j] + 1LL*a[i][k] * b[k][j]%m;
				temp[i][j] %= m;
			}
		}
	}

	memcpy(c, temp, sizeof temp);
}


int main()
{
	cin >> n >> m;

	int f[N][N] = {1,1,1};

	int a[N][N] = {
		{0,1,0},
		{1,1,1},
		{0,0,1}
	};

	n--;

	int res[N][N];

	while (n>0) {
		if(n&1)mul(f, f, a);
		mul(a, a, a);
		n >>= 1;
	}
	
	cout << f[0][2] << endl;

	return 0;
}

posted on 2025-03-24 11:31  itdef  阅读(7)  评论(0)    收藏  举报

导航