cf Apple trees——递推记得想想矩阵快速幂

博客详细介绍了ACM竞赛中的一道题目,涉及到苹果树生命周期的递推模型。通过矩阵快速幂的方法解决大数情况下苹果树数量的计算问题,解释了如何构建递推矩阵,并对初始条件和边界情况进行处理。提供了题意、思路和代码示例。
摘要由CSDN通过智能技术生成

**

cf Apple trees——递推要记得想想矩阵快速幂

**

先上原题:
In the beginning God created the heaven and the earth, the next five days God created the light, the water, the sky, the land, the trees and the living creatures, and on the sixth day he formed a man from the dust of the ground, called Adam. Afterwards, God took one of the man’s ribs and made a woman from the rib, called Eve. Adam and Eve lived in peace and harmony in the land, until God told them they should not take any apple from the only apple tree in Earth (at that moment, in year 0).

How they disobeyed God is a story from another day, now we are interested in how apple trees population increased over all those years. Apple trees are very interesting because their cycle of life is the following: first an apple fall into the ground and immediately a new apple tree blooms, from this moment we consider this as an apple tree, exactly ten years later the tree is full-grown and it starts to generate apples, from here every ten years the tree generates f(x) apples, where and x is the age of the tree, note that x will be always be a multiple of 10. Every apple generated from a tree will fall into the ground and generate a new tree, finally every apple tree dies exactly at the age of 45.

Now we want to know how many apple trees will be living on Earth after n years of the creation. At year 0 the apple tree created by God was not full-grown (this happened 10 years later).

Input
The input consists of only one integer n (0 ≤ n ≤ 10^15) - the number of years after the creation of the Earth including Adam, Eve and the first apple tree.

Output
Print a single integer - the number of apple trees on Earth at the end of the n - th year after the creation of Earth, as this number can be very big print it modulo 109 + 7

Examples
input
9
output
1
input
10
output
17
input
44
output
77328
input
45
output
77327

Note
In the first case, at 9th year there was on Earth only the apple tree that God first created.

In second case we have that in the 10th year the first apple tree was full-grown and 16 apples that belonged to that tree made new 16 trees, therefore there were 17 trees.

In fourth case, we have that at year 45 the first apple tree died, so it doesn’t count anymore.

题意
最初有一棵苹果树,每十年会播撒一次种子(保证掉下的种子都能落地马上变成苹果树,以同样的规律成长和播撒种子),对于每棵树,第10年会播撒16颗种子,第20年会播撒9颗种子,第30年会播撒4颗种子,第40年会播撒1颗种子,第45年树死亡。问第n年一共有多少棵苹果树。

思路
很明显这是个递推,且前面递推出的数据在后面的计算中用得到。比如:

第k年 0岁树的数量 10岁的树数量 20岁的树数量 30岁的树数量 40岁的树数量
0 1 0 0 0 0
10 16 1 0 0 0
20 16*16+9 16 1 0 0

再看看数据,1e15。暴力递推就别想了,矩阵快速幂了解一下 ~

(我不会在博客里搞矩阵啊苟命)
原本初始矩阵如下:
1
0
0
0

本来想的是这样的一个递推矩阵:
16 9 4 1
1 0 0 0
0 1 0 0
0 0 1 0

但是发现在树第45年的时候答案是只算活着的树的,所以得再加一行一列来减去死去的树的数量。新矩阵如下:
16 9 4 1 0
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0

那么初始矩阵也要相应变成:
1
0
0
0
0

这样就能推出每整十年年龄多少的树有多少颗了,注意年数个位数的特判。

代码

#include <stdio.h>
#include <math.h>
#include <iostream>
#include 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值