矩阵快速幂:
{{1,1},
{1,0}}
#include <bits/stdc++.h>
using namespace std;
#define ms(a,b) memset(a,b,sizeof a)
#define sz(x) (int)x.size()
#define ll long long
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+5;
const int mod = 1e9 + 7;
struct Matrix{
ll m[105][105];
int n;
Matrix(int _n=0,int v = 0)
{
n = _n;
for (int i = 0; i < n;i++)
for (int j = 0; j < n;j++)
m[i][j] = (i == j) ? v : 0;
}
Matrix operator*(const Matrix& o) const {
Matrix ans(n, 0);
for (int k = 0; k < n;k++)
for (int i = 0; i < n;i++)
for (int j = 0; j < n;j++)
ans.m[i][j] = (ans.m[i][j] + m[i][k] * o.m[k][j]) % mod;
return ans;
}
};
ll n;
Matrix quick_pow(Matrix A,ll k)
{
Matrix ans(A.n, 1);
while(k)
{
if(k&1) ans = ans*A;
k >>= 1;
A = A * A;
}
return ans;
}
ll m[105][105] = {{1,1},{1,0}};
int main()
{
cin >> n;
if(n<=2) {
cout << 1 << endl;
return 0;
}
Matrix A(2, 0);
memcpy(A.m, m, sizeof m);
A = quick_pow(A, n - 2);
cout << (A.m[0][0]+A.m[1][0])%mod << endl;
return 0;
}
模板