TengBieBie已经学习了很多关于斐波那切数列的性质,所以他感到一些些厌烦。现在他遇到了一个新的数列,这个数列叫做Float-Bonacci。这里有一个关于Float-Bonacci的定义。
对于一个具体的n,TengBieBie想要快速计算FB(n).
但是TengBieBie对FB的了解非常少,所以他向你求助。
你的任务是计算FB(n).FB(n)可能非常大,请输出FB(n)%1,000,000,007 (1e9+7)即可。
Input
输入共一行,在一行中给出一个整数n (1<=n<=1,000,000,000)。
Output
对于每一个n,在一行中输出FB(n)%1,000,000,007 (1e9+7)。
Input示例
5
Output示例
2
令F[n] = F[n-10]+F[n-34],之后构造个34*34的矩阵
#include<stdio.h>
#include<string.h>
#define mod 1000000007
#define LL long long
typedef struct Matrix
{
LL i, j, k, a[55][55];
void init()
{
memset(a, 0, sizeof(a));
a[1][10] = a[1][34] = 1;
for(i=1;i<=33;i++)
a[i+1][i] = 1;
}
void unit()
{
memset(a, 0, sizeof(a));
for(i=1;i<=34;i++)
a[i][i] = 1;
}
Matrix operator * (const Matrix &b) const
{
Matrix x;
LL i, j, k;
memset(x.a, 0, sizeof(x.a));
for(i=1;i<=34;i++)
{
for(j=1;j<=34;j++)
{
for(k=1;k<=34;k++)
x.a[i][j] = (x.a[i][j]+(a[i][k]*b.a[k][j])%mod)%mod;
}
}
return x;
}
}Matrix;
Matrix Jz;
LL a[46];
Matrix Powto(Matrix a, LL b)
{
Matrix E;
E.unit();
while(b)
{
if(b%2==1) E = E*a, b--;
else a = a*a, b /= 2;
}
return E;
}
int main(void)
{
LL n, i, ans;
for(i=1;i<=40;i++)
a[i] = 1;
scanf("%lld", &n);
if(n<=4)
printf("1\n");
else
{
n *= 10;
Jz.init();
Jz = Powto(Jz, n-40);
ans = 0;
for(i=1;i<=34;i++)
ans = (ans+(Jz.a[1][i]*a[i])%mod)%mod;
printf("%lld\n", ans);
}
return 0;
}