记录编号 122526 评测结果 AAAAAAAAAA
题目名称 斐波那契平方和 最终得分 100
用户昵称 GravatarHouJikan 是否通过 通过
代码语言 C++ 运行时间 0.002 s
提交时间 2014-09-23 21:56:44 内存使用 0.31 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <ctime>
using namespace std;
const long long MOD=1000000007;
struct square
{
  unsigned long long num[3][3];
  square()
  {
    memset(this->num,0,sizeof(this->num));
  }
  square operator *(square &i) const
  {
    square k;
    square j=*this;
    k.num[1][1]=((j.num[1][1]%MOD*i.num[1][1]%MOD)+(j.num[1][2]%MOD*i.num[2][1]%MOD))%MOD;
    k.num[1][2]=((j.num[1][1]%MOD*i.num[1][2]%MOD)+(j.num[1][2]%MOD*i.num[2][2]%MOD))%MOD;
    k.num[2][1]=((j.num[2][1]%MOD*i.num[1][1]%MOD)+(j.num[2][2]%MOD*i.num[2][1]%MOD))%MOD;
    k.num[2][2]=((j.num[2][1]%MOD*i.num[1][2]%MOD)+(j.num[2][2]%MOD*i.num[2][2]%MOD))%MOD;
    return k;
  }
};
square ZERO;
square ONE;
square quickpow(square i,long long  e);
int main()
{  
  long long n;
  freopen("fibsqr.in","r",stdin);
  freopen("fibsqr.out","w",stdout);
  ZERO.num[1][1]=ZERO.num[2][2]=1;ZERO.num[1][2]=ZERO.num[2][1]=0;
  ONE.num[1][1]=ONE.num[1][2]=ONE.num[2][1]=1;ONE.num[2][2]=0;
  scanf("%lld",&n);
    square ans=quickpow(ONE,n);
    cout<<((long long)ans.num[2][1]%MOD*ans.num[1][1]%MOD)%MOD<<endl;
  return 0;
}
square quickpow(square i,long long e)
{ 
   if (e==1)
     return ONE;
   if (e==0)
     return ZERO;
   square half=quickpow(i,e/2);
   half=half*half;
   if (e%2==1)
     half=half*ONE;
   return half;
}