【luogu1962】【矩阵乘法】【快速幂】斐波那契数列

传送门

题目背景

大家都知道,斐波那契数列是满足如下性质的一个数列:

F n = { 1   ( n ≤ 2 ) F n − 1 + F n − 2   ( n ≥ 3 ) F_n = \left\{\begin{aligned} 1 \space (n \le 2) \\ F_{n-1}+F_{n-2} \space (n\ge 3) \end{aligned}\right. Fn={ 1 (n2)Fn1+Fn2 (n3)

题目描述

请你求出 F n   m o d   1 0 9 + 7 F_n \bmod 10^9 + 7 Fnmod109+7 的值。

输入格式

一行一个正整数 n n n

输出格式

输出一行一个整数表示答案。

输入输出样例
输入 #1
5
输出 #1
5
输入 #2
10
输出 #2
55
说明/提示
【数据范围】

对于 60 % 60\% 60% 的数据, 1 ≤ n ≤ 92 1\le n \le 92 1n92
对于 100 % 100\% 100% 的数据, 1 ≤ n < 2 63 1\le n < 2^{63} 1n<263


解题思路

详情请见矩阵乘法

单纯的我没有意识到 n n n真的会 = 1 =1 =1: )


Code

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int Mod = 1000000007;
long long n;

struct DT{
    
    
	int n, m;
	long long aed[5][5];
}A, B, Ac;

DT operator *(DT a, DT b){
    
    
	DT c;
	c.n = a.n, c.m = b.m;
	memset (c.aed, 0, sizeof (c.aed));
	for (int k = 1; k <= a.m; k++)
		for (int i = 1; i <= c.n; i++)
			for (int j = 1; j <= c.m; j++)
				c.aed[i][j] = (c.aed[i][j] + a.aed[i][k] * b.aed[k][j] % Mod) % Mod;
	return c;
}

void power (long long n){
    
    
	if (n == 1)
	{
    
    
		Ac = A;
		return;
	}
	power (n / 2);
	Ac = Ac * Ac;
	if (n % 2) Ac = Ac * A; 
}

int main(){
    
    
	A.n = A.m = 2;
	A.aed[1][2] = A.aed[2][1] = A.aed[2][2] = 1;
	Ac = A;
	B.n = 1, B.m = 2;
	B.aed[1][1] = B.aed[1][2] = 1;
	scanf ("%lld", &n);
	if (n <= 2)
		printf ("1");
	else {
    
    
		power (n - 1);
		B = B * Ac;
		printf ("%lld", B.aed[1][1]);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39940018/article/details/111388563
今日推荐