题目描述 Description
在“1250 Fibonacci数列”中,我们求出了第n个Fibonacci数列的值。但是1250中,n<=109。现在,你的任务仍然是求出第n个Fibonacci数列的值,但是注意:n为整数,且1 <= n <= 100000000000000
输入描述 Input Description
输入有多组数据,每组数据占一行,为一个整数n(1 <= n <= 100000000000000)
输出描述 Output Description
输出若干行。每行输出第(对应的输入的)n个Fibonacci数(考虑到数会很大,mod 1000000007)
样例输入 Sample Input
3
4
5
样例输出 Sample Output
2
3
5
数据范围及提示 Data Size & Hint
1 <= n <= 100000000000000
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const long long mod=1000000007;
typedef long long ll;
ll n;
struct hh
{
ll ma[4][4];
}c,b,ans;
hh Mar(hh ans,hh b)
{
for(ll i=1;i<=2;i++)
for(ll j=1;j<=2;j++)
c.ma[i][j]=ans.ma[i][j]%mod,ans.ma[i][j]=0;
for(ll i=1;i<=2;i++)
for(ll j=1;j<=2;j++)
for(ll k=1;k<=2;k++)
ans.ma[i][j]=(ans.ma[i][j]%mod+((c.ma[i][k]%mod)*(b.ma[k][j]%mod))%mod)%mod;
return ans;
}
void ksm(hh a,int s)
{
ans.ma[1][1]=ans.ma[2][1]=1;
ans.ma[1][2]=ans.ma[2][2]=0;
b.ma[1][1]=b.ma[1][2]=b.ma[2][1]=1;
b.ma[2][2]=0;
while(s>=1)
{
if(s&1) ans=Mar(ans,b);
b=Mar(b,b);
s>>=1;
}
return;
}
void solve()
{
while(scanf("%lld",&n))
{
if(n==1 || n==2) {cout<<1<<endl;}
else ksm(ans,n-2),printf("%lld\n",ans.ma[1][1]%mod);
}
}
int main()
{
solve();
return 0;
}