题目不多说了,就是给个n,求斐波那契第n项。
解:
通过矩阵乘法及快速幂得到来得到结果,矩阵乘法不知道的去看线性(高等)代数或者百科去。
PS:这种题还有好多变式,最重要的是求出是哪个矩阵的幂。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
const int MOD = 1000000007;
struct mat
{
long long m[2][2];
};
long long n;
mat mul(mat a, mat b)
{
mat c;
memset(c.m, 0, sizeof(c.m));
for(int i = 0; i < 2; ++i)
{
for(int j = 0; j < 2; ++j)
{
for(int k = 0; k < 2; ++k)
c.m[i][j] += (a.m[i][k] * b.m[k][j]) % MOD;
c.m[i][j] %= MOD;
}
}
return c;
}
mat s;
mat powmod(long long n)
{
mat ans;
memset(ans.m, 0, sizeof(ans.m));
for(int i = 0; i < 2; ++i)
ans.m[i][i] = 1;
while(n)
{
if(n & 1)
ans = mul(ans,s);
s = mul(s,s);
n >>= 1;
}
return ans;
}
int main()
{
scanf("%lld",&n);
s.m[0][0] = 1;
s.m[0][1] = 1;
s.m[1][0] = 1;
s.m[1][1] = 0;
mat qwq = powmod(n);
printf("%lld\n",qwq.m[1][0]);
return 0;
}