蒜头君的小伙伴在 第一年 送给他一对 一岁 的兔子,并告诉他:这种兔子 刚生下来时算 0 岁,到了 2 岁时就可以繁殖了,它在 2−10 岁时,每年会生下来一对兔子,这些兔子到了 2 岁也可以繁殖,但这些兔子在 10 岁那年 生完仔后 不久就会死亡,蒜头君想知道,第 n 年兔子 产仔之后(第 n 年 10 岁的兔子此时已经死亡),他会有多少对兔子。结果对 1000000007 取模。
输入格式
共一行,一个正整数 n,表示蒜头君想知道第 n 年的兔子总对数。
输出格式
输出一个整数,表示第 n 年兔子总对数对 1000000007 取模的值。
数据规模
对于 30% 的数据,满足 1≤n≤103;
对于 60% 的数据,满足 1≤n≤105;
对于 100% 的数据,满足 1≤n≤109。
样例输入1
10
样例输出1
88
样例输入2
88
样例输出2
352138150
样例输入3
10086
样例输出3
405567313
题目来源
一篇很好的题解!!! 传送门1
注意第n年10岁的兔子已经死掉了!!!
#include<cstdio>
#include<cstring>
const int mod=1000000007;
typedef int matrix[12][12];
void calc(matrix a,matrix b)
{
matrix c;
for(int i=0;i<=10;i++)
for(int j=0;j<=10;j++)
{
c[i][j]=0;
for(int k=0;k<=10;k++)
c[i][j]=(c[i][j]+(long long)a[i][k]*b[k][j]%mod)%mod;
}
for(int i=0;i<=10;i++)
for(int j=0;j<=10;j++)
a[i][j]=c[i][j];
}
int fast(int x)
{
matrix ans,a;
memset(ans,0,sizeof(ans));
memset(a,0,sizeof(a));
for(int i=0;i<=10;i++) ans[i][i]=1;
for(int i=1;i<=9;i++) a[0][i]=1;
for(int i=1;i<=10;i++) a[i][i-1]=1;
while(x)
{
if(x&1) calc(ans,a);
x=x>>1;
calc(a,a);
}
int sum=0;
for(int i=0;i<=9;i++) sum=(sum+ans[i][1])%mod;
return sum;
}
int main()
{
int n;scanf("%d",&n);
printf("%d\n",fast(n-1));
return 0;
}