链接
题目描述
求斐波那契数列第n项
答案取模1e9+7
思路
矩阵乘法直接求就好了
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const ll mo = 1e9 + 7;
ll n;
struct matrix
{
ll n, m;
ll a[15][15];
}a, ans, c;
matrix operator *(matrix a, matrix b)
{
c.n = a.n; c.m = b.m;
for(int i = 1; i <= c.n; ++i)
for(int j = 1; j <= c.m; ++j)
c.a[i][j] = 0;
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.a[i][j] = ((a.a[i][k] * b.a[k][j]) % mo + c.a[i][j]) % mo;
return c;
}
ll ksm(ll k)
{
while(k)
{
if(k & 1) ans = ans * a;
a = a * a;
k >>= 1;
}
}
int main()
{
scanf("%lld", &n);
if(n <= 2) {
printf("1");
return 0;
}
a.n = 2; a.m = 2;
ans.n = 1; ans.m = 2;
a.a[1][1] = a.a[1][2] = a.a[2][1] = 1;
ans.a[1][1] = ans.a[1][2] = 1;
ksm(n - 2);
printf("%d", ans.a[1][1] % mo);
return 0;
}