题目链接:https://nanti.jisuanke.com/t/16442

题意:

  有个人在第一年送了你一对1岁的兔子。这种兔子刚生下来的时候算0岁,当它在2~10岁的时候,每年都会生下一对兔子,并且它在10岁那年生完兔子后就会挂掉。现在让你算出第t年兔子的总数(不算那一年10岁的兔子)。

题解:

  我们用一个1*10的矩阵代表某一年的兔子数量,第k列上的数字n代表今年有n只k岁的兔子。

  那么初始矩阵是这样的:

  

  接下来考虑怎样构造特殊矩阵。

  有两个转移关系:

    第二年0岁的兔子数 = 第二年2~10岁的兔子数之和 = 今年1~9岁的兔子数之和

    第二年k (1<=k<=10) 岁的兔子数 = 今年k-1岁的兔子数

  也就是这样转移:

  

  b[0] = a[1] + a[2] + ... + a[9]

  b[1] = a[0]

  b[2] = a[1]

  ...

  b[9] = a[8]

  b[10] = a[9]

  那么特殊矩阵也就出来了:

  

  所以第t年的矩阵ans = 初始矩阵start * ( 特殊矩阵special ^ (t-1) )

  优化:由于在整个过程中根本没有用到每年10岁的兔子数量,所以可以省去初始矩阵的第10列,以及特殊矩阵的第10列&第10行。

AC Code:

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #define MAX_L 15
  5. #define MOD 1000000007
  6.  
  7. using namespace std;
  8.  
  9. struct Mat
  10. {
  11. int n;
  12. int m;
  13. long long v[MAX_L][MAX_L];
  14. Mat()
  15. {
  16. memset(v,,sizeof(v));
  17. n=;
  18. m=;
  19. }
  20. };
  21.  
  22. int t;
  23. long long sum=;
  24.  
  25. Mat make_unit(int k)
  26. {
  27. Mat mat;
  28. mat.n=k;
  29. mat.m=k;
  30. for(int i=;i<k;i++)
  31. {
  32. mat.v[i][i]=;
  33. }
  34. return mat;
  35. }
  36.  
  37. Mat make_start()
  38. {
  39. Mat mat;
  40. mat.n=;
  41. mat.m=;
  42. mat.v[][]=;
  43. return mat;
  44. }
  45.  
  46. Mat make_special()
  47. {
  48. Mat mat;
  49. mat.n=;
  50. mat.m=;
  51. for(int i=;i<=;i++)
  52. {
  53. mat.v[i][]=;
  54. mat.v[i-][i]=;
  55. }
  56. return mat;
  57. }
  58.  
  59. Mat mul_mat(const Mat &a,const Mat &b)
  60. {
  61. Mat c;
  62. c.n=a.n;
  63. c.m=b.m;
  64. for(int i=;i<a.n;i++)
  65. {
  66. for(int j=;j<b.m;j++)
  67. {
  68. for(int k=;k<a.m;k++)
  69. {
  70. c.v[i][j]+=(a.v[i][k]*b.v[k][j])%MOD;
  71. c.v[i][j]%=MOD;
  72. }
  73. }
  74. }
  75. return c;
  76. }
  77.  
  78. Mat quick_pow_mat(Mat mat,long long k)
  79. {
  80. Mat ans;
  81. ans=make_unit(mat.n);
  82. while(k)
  83. {
  84. if(k&)
  85. {
  86. ans=mul_mat(ans,mat);
  87. }
  88. k>>=;
  89. mat=mul_mat(mat,mat);
  90. }
  91. return ans;
  92. }
  93.  
  94. void read()
  95. {
  96. cin>>t;
  97. }
  98.  
  99. void solve()
  100. {
  101. Mat start=make_start();
  102. Mat special=make_special();
  103. Mat ans=mul_mat(start,quick_pow_mat(special,t-));
  104. for(int i=;i<=;i++)
  105. {
  106. sum=(sum+ans.v[][i])%MOD;
  107. }
  108. }
  109.  
  110. void print()
  111. {
  112. cout<<sum<<endl;
  113. }
  114.  
  115. int main()
  116. {
  117. read();
  118. solve();
  119. print();
  120. }

计蒜客模拟赛D2T1 蒜头君的兔子:矩阵快速幂的更多相关文章

  1. 计蒜客模拟赛D1T1 蒜头君打地鼠:矩阵旋转+二维前缀和

    题目链接:https://nanti.jisuanke.com/t/16445 题意: 给你一个n*n大小的01矩阵,和一个k*k大小的锤子,锤子只能斜着砸,问只砸一次最多能砸到多少个1. 题解: 将 ...

  2. 计蒜客模拟赛D2T3 蒜头君救人:用bfs转移状压dp

    题目链接:https://nanti.jisuanke.com/t/16444 题意: 蒜头君是一个乐于助人的好孩子,这天他所在的乡村发生了洪水,有多名村民被困于孤岛上,于是蒜头君决定去背他们离开困境 ...

  3. 计蒜客模拟赛D1T3 蒜头君的坐骑:用dfs转移dp

    题目链接:https://nanti.jisuanke.com/t/16447 题意: 蒜头君有一只坐骑,人马. 一天,蒜头君骑着他的坐骑走上了一片n*m的大荒野,一开始时,蒜头君在(1,1)点,他要 ...

  4. 计蒜客模拟赛D2T2 蒜头君的排序:区间逆序对(移动端点) + 树状数组

    题目链接:https://nanti.jisuanke.com/t/16443 题意: 给你一个由1~n构成的正整数序列,有m组询问,每组询问要求输出[l , r]区间内的逆序对个数. 数据范围: 对 ...

  5. 计蒜客模拟赛D1T2 蒜头君的树:树上节点之间最短距离和

    题目链接:https://nanti.jisuanke.com/t/16446 题意: 给你一棵有n个节点的树以及每条边的长度,输出树上节点之间的最短距离和.然后进行m次操作,每次操作更改一条边的长度 ...

  6. 计蒜客模拟赛5 D2T1 成绩统计

    又到了一年一度的新生入学季了,清华和北大的计算机系同学都参加了同一场开学考试(因为两校兄弟情谊深厚嘛,来一场联考还是很正常的). 不幸的是,正当老师要统计大家的成绩时,世界上的所有计算机全部瘫痪了. ...

  7. 计蒜客模拟赛5 D2T2 蚂蚁搬家

    很久很久以前,有很多蚂蚁部落共同生活在一片祥和的村庄里.但在某一天,村庄里突然出现了一只食蚁兽,蚂蚁们为了保全性命而决定搬家. 然而这个村庄四面环山,想要离开这个村庄必须要从地洞里离开,村子里一共有 ...

  8. 计蒜客模拟赛 #5 (B 题) 动态点分治+线段树

    虽然是裸的换根dp,但是为了在联赛前锻炼码力,强行上了点分树+线段树. 写完+调完总共花了不到 $50$ 分钟,感觉还行. code: #include <bits/stdc++.h> # ...

  9. 2019ICPC西安邀请赛(计蒜客复现赛)总结

    开始时因为吃饭晚了一刻钟,然后打开比赛.看了眼榜单A题已经过了二十来个队伍了,宝儿就去做A. 传师说最后一题看题目像最短路,于是我就去看M了,宝儿做完之后也来陪我看.M一开始看到时以为是像   POJ ...

随机推荐

  1. Vivo展柜灯怎样设计才吸引大量客户?

    1.vivo展柜灯计划的目标是使消耗者在无限的时空中最无效地承受信息.因而,vivo展柜灯计划便是围绕着怎样无效地进步展现活动的服从和质量停止的.除了展现环境本身的计划之外,展现对象陈列方式的计划也是 ...

  2. 从浅入深剖析angular表单验证

    最近手上维护的组件剩下的BUG都是表单验证,而且公司的表单验证那块代码经历的几代人,里面的逻辑开始变得不清晰,而且代码结构不是很angular. 是很有必要深入了解表单验证. 入门之前,我觉得应该先了 ...

  3. jquery.jqprint-0.3.js打印table表格遇到的坑

    在谷歌控制台输入window.print();可以调起当前整个页面的打印预览,那么要想打印页面某块区域内容怎么办呢? 我找到了jqprint插件,其原理是运用iframe 元素创建另外一个文档的内联框 ...

  4. usaco training 4.1.2 Fence Rails 题解

    Fence Rails题解 Burch, Kolstad, and Schrijvers Farmer John is trying to erect a fence around part of h ...

  5. 解决window7 x64位Anaconda启动报错:AttributeError: '_NamespacePath' object has no attribute 'sort'

    最近论文需要用到python做数据分析,python语法简单,但是Windows下安装第三方包恶心的要命,statsmodels用pip死活安装不上,网上查了说包相互依赖windows下的pip不能下 ...

  6. php与MySQL(基本操作)

    PHP连接 MySQL 在我们访问 MySQL 数据库前,我们需要先连接到数据库服务器,连接服务器,我们使用mysqli_connect()函数. 在使用这个函数之前,我们首先来看一下这个函数的语法: ...

  7. 没有绝对安全的系统:写在AES 256破解之后

    NULL 在理论上,理论和实践是一致的.在实践中,呵呵. ——(应该是)爱因斯坦(说的) (INFO:本文中不会出现公式,请放心阅读) AES 256被破解了? 对于TLNR(Too Long, No ...

  8. (转)Eclipse中自动添加注释(作者,时间)

    方法一:Eclipse中设置在创建新类时自动生成注释  windows-->preference  Java-->Code Style-->Code Templates  code- ...

  9. Storm源码阅读之SpoutOutputCollector

    不得不说storm是一个特别棒的实时计算框架.为了对后文理解的方便,先说几个storm中的术语: Topology:拓扑图或者拓扑结构.在storm中它通过消息分组的分式连接Spout和Bolt节点定 ...

  10. Oracle和MySQL分组查询GROUP BY

    Oracle和MySQL分组查询GROUP BY 真题1.Oracle和MySQL中的分组(GROUP BY)有什么区别? 答案:Oracle对于GROUP BY是严格的,所有要SELECT出来的字段 ...