分析:直接暴力算有30分,像斐波那契那样推式子算有60分,如果想要得到100分就要用一种数列题的常见优化--矩阵了.

当前的兔子数和十年内的兔子数有关,我们需要1个1*11的矩阵,来记录当前为0岁、1岁、2岁......兔子的数量,同时还需要一个快速幂矩阵进行计算.由于一年后a[1] = a[0],a[2] = a[1],......,a[10] = a[9],a[0] = a[1] + a[2] + a[3] + ...... + a[10],很容易构造出矩阵来.

因为矩阵比较复杂,还是推荐用结构体来写.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int mod = ;
int t;
long long print,sum; struct node
{
int n, m;
long long a[][];
node()
{
memset(a, , sizeof(a));
n = ;
m = ;
}
}s,p,ans; node mul(node a, node b)
{
node c;
c.n = a.n;
c.m = b.m;
for (int i = ; i < a.n; i++)
for (int j = ; j < b.m; j++)
for (int k = ; k < a.m; k++)
{
c.a[i][j] += (a.a[i][k] * b.a[k][j]) % mod;
c.a[i][j] %= mod;
}
return c;
} node qpow(node a, int b)
{
node t;
t.n = ;
t.m = ;
for (int i = ; i < ; i++)
t.a[i][i] = ;
while (b)
{
if (b & )
t = mul(t, a);
a = mul(a, a);
b >>= ;
}
return t;
} int main()
{
scanf("%d", &t);
s.n = ;
s.m = ;
s.a[][] = ;
p.n = ;
p.m = ;
for (int i = ; i <= ; i++)
{
p.a[i][] = ;
p.a[i - ][i] = ;
}
p.a[][] = ;
ans = mul(s, qpow(p, t - ));
for (int i = ; i <= ; i++)
sum = (sum + ans.a[][i]) % mod;
printf("%lld\n", sum); return ;
}

最新文章

  1. thinkphp传递参数
  2. JS对Array进行自定制排序
  3. WampServer Version 2.5 bug修改
  4. design the relations
  5. uvision4 ide已停止工作
  6. 南阳理工ACM-OJ 分数加减法 最大公约数的使用
  7. HTML&amp;CSS基础学习笔记1.16-单元格间距和表格主体
  8. document.write 存在几个问题?应该注意
  9. Java IO 学习总结 学习手册总结
  10. FPGA基础知识了解
  11. SharedPreferences解析
  12. CentOS 7 系统的初化始配置
  13. mysql替换字符串
  14. extern字符串常量,宏定义字符串常量,怎么选
  15. canvas与svg特性和使用对比
  16. 获取URL中的链接(可中文也可英文)
  17. some ideas
  18. Python之——遇到的小知识点总结
  19. J02-Java IO流总结二 《概述》
  20. 如何在不改SQL的情况下优化数据库

热门文章

  1. ACM_Encoding
  2. Ubuntu Server 上安装pip后pip命令报错的解决办法
  3. Fighting
  4. Android Dialogs(1)Dialog简介及Dialog分类
  5. 使用mysql实现mybatis的分页效果
  6. 转 oracle apex 使用
  7. UML 用例图(转载)
  8. 172 Factorial Trailing Zeroes 阶乘后的零
  9. Hackonacci Matrix Rotations 观察题 ,更新了我的模板
  10. 12.1Java-构造方法