Apple Trees
题目描述:
这个题目讲述的是,假设存在一棵苹果树,每过十年,这些苹果树上便会长出个苹果,
代表苹果树的岁数,这些新长出来的苹果不会停留在树上,每个苹果会掉到地上长出新的苹果树,然后这些苹果树的寿命是45岁,题目让我们求的是第
年总共有多少棵苹果树。
题目分析:
根据苹果树的寿命,我们可以求出苹果树在10岁,20岁,30岁,40岁长出来的苹果数分别为16,9,4和1,然后根据这个关系建立递推关系式:,其中
代表的是,在第
年新长出来苹果树的数目。
由于n最大可达到,因此可以将上述递推关系式用矩阵表示:
然后利用矩阵快速幂就可以快速求出答案。
代码:
#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <cstdlib>
#include <stdlib.h>
#include <cmath>
#include <math.h>
#include <algorithm>
#include <cstring>
#include <string>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#include <deque>
#define reg register
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define mod 1000000007
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define lowbit(x) (x&(-x))
using namespace std;
struct node
{
ll matrix[5][5];
node ()
{
memset(matrix,0,sizeof(matrix));
}
};
node operator * (const node &a,const node &b)
{
node ans;
for (int i=0;i<5;i++)
{
for (int j=0;j<5;j++)
{
for (int k=0;k<5;k++) ans.matrix[i][j]=(ans.matrix[i][j]+a.matrix[i][k]*b.matrix[k][j]%mod)%mod;
}
}
return ans;
}
node m_pow(node m,ll t)
{
node ans;
for (int i=0;i<5;i++) ans.matrix[i][i]=1;
while (t)
{
if (t&1) ans=ans*m;
t>>=1;
m=m*m;
}
return ans;
}
int main()
{
ll n;
cin>>n;
node m;
m.matrix[0][0]=16;
m.matrix[0][1]=9;
m.matrix[0][2]=4;
m.matrix[0][3]=1;
m.matrix[1][0]=m.matrix[2][1]=m.matrix[3][2]=m.matrix[4][3]=1;
node ans=m_pow(m,n/10);
if (n%10<5)
{
cout<<(ans.matrix[0][0]+ans.matrix[1][0]+ans.matrix[2][0]+ans.matrix[3][0]+ans.matrix[4][0])%mod;
return 0;
}
cout<<(ans.matrix[0][0]+ans.matrix[1][0]+ans.matrix[2][0]+ans.matrix[3][0])%mod;
return 0;
}