题目背景
大家都知道,斐波那契数列是满足如下性质的一个数列:
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 (n≤2)Fn−1+Fn−2 (n≥3)
题目描述
请你求出 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
1≤n≤92;
对于
100
%
100\%
100% 的数据,
1
≤
n
<
2
63
1\le n < 2^{63}
1≤n<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]);
}
}