斐波那契前 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;
}
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力

