http://acm.whu.edu.cn/land/problem/detail?problem_id=1540&contest_id=12
斐波纳契数立方和公式
但是除取模再除2不对,然后yy一下,对MOD的两倍取模再除2就对了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long LL;
const int MOD=2000000014;
const int M=1000000007;
const int N=4;
int n;
//矩阵为N*N
typedef vector<LL> vec;
typedef vector<vec> mat;
mat mul(mat &A,mat &B)
{
mat C(A.size(),vec(A.size()));
for(int i=0; i<A.size(); i++)
for(int j=0; j<B[0].size(); j++)
for(int k=0; k<B.size(); k++)
C[i][j]=(C[i][j]+A[i][k]*B[k][j])%MOD;
return C;
}
mat pow(mat A,LL n)
{
mat B(A.size(),vec(A.size()));
for(int i=0; i<A.size(); i++)
B[i][i]=1;
while(n>0)
{
if(n&1)
B=mul(B,A);
A=mul(A,A);
n>>=1;
}
return B;
}
int main()
{
while(scanf("%d",&n)!=EOF,n)
{
mat A(2,vec(2));
A[0][0]=A[0][1]=A[1][0]=1;
A[1][1]=0;
A=pow(A,n-1);
long long f2=A[0][0]%MOD,f1=A[0][1]%MOD;
long long f3=(f1+f2)%MOD;
long long sum=(f2*f3%MOD*f3%MOD)%MOD;
if(n%2==0)sum=(sum-f1+MOD)%MOD;
else sum=(sum+f1)%MOD;
sum++;
sum%=MOD;
printf("%d\n",sum/2%M);
}
return 0;
}