#include <bits/stdc++.h>
#define mod 1000000007
#define ll long long
using namespace std;
struct mat
{
ll a[2][2];
};
mat mat_mul(mat x, mat y) //矩阵乘法
{
mat res;
memset(res.a, 0, sizeof(res.a));
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++)
for(int k = 0; k < 2; k++)
{
res.a[i][j] += x.a[i][k]*y.a[k][j];
res.a[i][j] %= mod;
}
return res;
}
ll mat_pow(int n) //矩阵快速幂类似于快速幂
{
mat c, res;
c.a[0][0] = c.a[0][1] = c.a[1][0] = 1;
c.a[1][1] = 0;
memset(res.a, 0, sizeof(res.a));
for(int i = 0; i < 2; i++)
res.a[i][i] = 1;
while(n)
{
if(n & 1) res = mat_mul(res, c);
c = mat_mul(c, c);
n >>= 1;
}
return res.a[0][0];
}
int main()
{
int n;
while(~scanf("%d",&n)&&n!=-1)
{
cout << mat_pow(n - 1) << endl;
}
return 0;
}
参考网址 http://blog.csdn.net/nyist_tc_lyq/article/details/52981353