【HDU4471】Homework(矩阵快速幂)

题面

Vjudge

给定一个数列的前\(m\)项,给定一个和前\(t\)项相关的递推式。

有\(q\)个位置的递推式单独给出,求数列第\(n\)项。

题解

大部分的转移还是相同的,所以可以提前构建好矩阵,预处理转移矩阵的\(2^n\),

这样子可以在\(O(t^2logn)\)时间里面进行矩阵快速幂。

对于特殊点排序,特殊点的数值直接爆算,总的复杂度还是正确的。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. using namespace std;
  8. #define ll long long
  9. #define MOD 1000000007
  10. #define MAX 105
  11. inline int read()
  12. {
  13. int x=0;bool t=false;char ch=getchar();
  14. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  15. if(ch=='-')t=true,ch=getchar();
  16. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  17. return t?-x:x;
  18. }
  19. struct Matrix
  20. {
  21. int s[MAX][MAX],n,m;
  22. int* operator[](int x){return s[x];}
  23. void clear(){memset(s,0,sizeof(s));}
  24. void init(){clear();for(int i=1;i<=n;++i)s[i][i]=1;}
  25. }A[35],F;
  26. int n,m,q,t,c[MAX],f[MAX];
  27. int N,T,C[MAX],mt;
  28. Matrix operator*(Matrix a,Matrix b)
  29. {
  30. Matrix ret;ret.clear();
  31. ret.n=a.n;ret.m=b.m;
  32. for(int i=1;i<=a.n;++i)
  33. for(int j=1;j<=b.m;++j)
  34. for(int k=1;k<=a.m;++k)
  35. ret[i][j]=(ret[i][j]+1ll*a[i][k]*b[k][j])%MOD;
  36. return ret;
  37. }
  38. void pre()
  39. {
  40. A[0].clear();A[0].n=A[0].m=mt;
  41. for(int j=1;j<=A[0].n-1;++j)A[0][j][j+1]=1;
  42. for(int i=1;i<=t;++i)A[0][i][1]=c[i-1];
  43. for(int i=1;(1<<i)<=n;++i)A[i]=A[i-1]*A[i-1];
  44. }
  45. void preF()
  46. {
  47. F.clear();F.n=1;F.m=mt;
  48. for(int i=1,j=m;i<=mt&&j;++i,--j)F[1][i]=f[j];
  49. }
  50. void fpow(int b)
  51. {
  52. for(int i=0;i<32;++i)
  53. if(b&(1<<i))
  54. F=F*A[i];
  55. return;
  56. }
  57. struct Spe{int N,T,C[MAX];}p[MAX];
  58. bool operator<(Spe a,Spe b){return a.N<b.N;}
  59. int main()
  60. {
  61. int TT=0;
  62. while(scanf("%d%d%d",&n,&m,&q)!=EOF)
  63. {
  64. for(int i=1;i<=m;++i)f[i]=read();
  65. mt=t=read();for(int i=0;i<t;++i)c[i]=read();
  66. for(int i=1;i<=q;++i)
  67. {
  68. p[i].N=read();p[i].T=read();
  69. if(p[i].N<=n)mt=max(mt,p[i].T);
  70. for(int j=1;j<=p[i].T;++j)p[i].C[j]=read();
  71. }
  72. sort(&p[1],&p[q+1]);
  73. pre();preF();
  74. int now=m;
  75. for(int i=1;i<=q;++i)
  76. {
  77. if(p[i].N<=now||p[i].N>n)continue;
  78. int N=p[i].N,T=p[i].T;
  79. for(int j=1;j<=T;++j)C[j]=p[i].C[j];
  80. fpow(N-now-1);now=N;int ff=0;
  81. for(int j=1;j<=T;++j)ff=(ff+1ll*C[j]*F[1][j])%MOD;
  82. for(int j=mt;j>1;--j)F[1][j]=F[1][j-1];F[1][1]=ff;
  83. }
  84. fpow(n-now);printf("Case %d: %d\n",++TT,F[1][1]);
  85. }
  86. return 0;
  87. }

【HDU4471】Homework(矩阵快速幂)的更多相关文章

  1. HDU 4471 矩阵快速幂 Homework

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4471 解题思路,矩阵快速幂····特殊点特殊处理····· 令h为计算某个数最多须知前h个数,于是写 ...

  2. BestCoder Round #29——A--GTY's math problem(快速幂(对数法))、B--GTY's birthday gift(矩阵快速幂)

    GTY's math problem Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  3. 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)

    题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...

  4. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...

  5. 51nod 1113 矩阵快速幂

    题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...

  6. 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

    还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...

  7. HDU5950(矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:f(n) = f(n-1) + 2*f(n-2) + n^4,f(1) = a , f(2 ...

  8. 51nod 1126 矩阵快速幂 水

    有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的值. Input 输 ...

  9. hdu2604(递推,矩阵快速幂)

    题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...

随机推荐

  1. linux挂在samba服务器到本地(用于备份文件到nas或者windows的文件服务器)

    1.安装工具 首先在linux上安装samba访问工具 sudo apt-get install smbclient sudo apt-get install cifs-utils 2.查看服务器目录 ...

  2. Vue.js项目中,当图片无法显示时则显示默认图片

    使用require将图片进入,写法如下: data: () => ({logo: 'this.src="' + require('../assets/img.png') + '&quo ...

  3. VPS挂机赚美刀详细介绍–Alexamaster操作流程

    跟 vps 主机打交道时间长了,手里也渐渐积累了些闲置的 vps.让它们这么闲着吧,感觉有些浪费资源:用起来吧,暂时又没有好的项目.一直听说通过 vps挂机可以赚回主机成本,甚至可以盈利.正好这两天有 ...

  4. NO.2:自学python之路------变量类型、列表、字典

    引言 本周初步认识了库,并学习了Python中各种类型的变量和常用操作.并完成了较为完善的用户与商家购物界面设计. 正文 模块: Python有标准库和第三方库.第三方库需要安装才能使用.大量的库可以 ...

  5. org.apache.poi版本问题

    问题描述: 今天跑一段历史代码,发现不能启动,抛出java.lang.NoSuchFieldError: RETURN_NULL_AND_BLANK 问题 解决办法: 把org.apache.poi的 ...

  6. react native中props的使用

    react native中props的使用 一.props的使用 1:父组件传递的方式 在子组件中可以用this.props访问到父组件传递的值 <View> <Text> { ...

  7. Python:print()函数的几个常用参数

    1.参数sep:设置输出字符产之间的字符串.默认是空格 name='Tomwenxing' age=' job='student' print(name,age,job) print(name,age ...

  8. 技术博客HTML

      <!DOCTYPE html>   <html lang="en">   <head>   <meta charset="U ...

  9. 读<<我是IT小小鸟>>

    <倔强><怒放的生命>以歌曲的含义来引入文章,让文章可以与音乐产生共鸣让读者可以直接明了的就直击到本篇文章的中心含义是非常受用的,在文中写了许多以自己为视角,以自己的成长经历来 ...

  10. Ubuntu命令行安装显卡驱动

    1. sudo apt-et purge nvidia* 卸载原有驱动 2. sudo add-apt-repository ppa:graphics-drivers sudo apt-get upd ...