【HDU4471】Homework(矩阵快速幂)

题面

Vjudge

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

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

题解

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

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

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

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define MOD 1000000007
#define MAX 105
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Matrix
{
int s[MAX][MAX],n,m;
int* operator[](int x){return s[x];}
void clear(){memset(s,0,sizeof(s));}
void init(){clear();for(int i=1;i<=n;++i)s[i][i]=1;}
}A[35],F;
int n,m,q,t,c[MAX],f[MAX];
int N,T,C[MAX],mt;
Matrix operator*(Matrix a,Matrix b)
{
Matrix ret;ret.clear();
ret.n=a.n;ret.m=b.m;
for(int i=1;i<=a.n;++i)
for(int j=1;j<=b.m;++j)
for(int k=1;k<=a.m;++k)
ret[i][j]=(ret[i][j]+1ll*a[i][k]*b[k][j])%MOD;
return ret;
}
void pre()
{
A[0].clear();A[0].n=A[0].m=mt;
for(int j=1;j<=A[0].n-1;++j)A[0][j][j+1]=1;
for(int i=1;i<=t;++i)A[0][i][1]=c[i-1];
for(int i=1;(1<<i)<=n;++i)A[i]=A[i-1]*A[i-1];
}
void preF()
{
F.clear();F.n=1;F.m=mt;
for(int i=1,j=m;i<=mt&&j;++i,--j)F[1][i]=f[j];
}
void fpow(int b)
{
for(int i=0;i<32;++i)
if(b&(1<<i))
F=F*A[i];
return;
}
struct Spe{int N,T,C[MAX];}p[MAX];
bool operator<(Spe a,Spe b){return a.N<b.N;}
int main()
{
int TT=0;
while(scanf("%d%d%d",&n,&m,&q)!=EOF)
{
for(int i=1;i<=m;++i)f[i]=read();
mt=t=read();for(int i=0;i<t;++i)c[i]=read();
for(int i=1;i<=q;++i)
{
p[i].N=read();p[i].T=read();
if(p[i].N<=n)mt=max(mt,p[i].T);
for(int j=1;j<=p[i].T;++j)p[i].C[j]=read();
}
sort(&p[1],&p[q+1]);
pre();preF();
int now=m;
for(int i=1;i<=q;++i)
{
if(p[i].N<=now||p[i].N>n)continue;
int N=p[i].N,T=p[i].T;
for(int j=1;j<=T;++j)C[j]=p[i].C[j];
fpow(N-now-1);now=N;int ff=0;
for(int j=1;j<=T;++j)ff=(ff+1ll*C[j]*F[1][j])%MOD;
for(int j=mt;j>1;--j)F[1][j]=F[1][j-1];F[1][1]=ff;
}
fpow(n-now);printf("Case %d: %d\n",++TT,F[1][1]);
}
return 0;
}

【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. luogu 2051 [AHOI2009]中国象棋

    luogu 2051 [AHOI2009]中国象棋 真是一道令人愉♂悦丧心并框的好题... 首先"没有一个炮可以攻击到另一个炮"有个充分条件就是没有三个炮在同一行或同一列.证明:显 ...

  2. 【word基础】如何取消word首字母大写

  3. sqlite两表更新update

    1 2 3 4 5 6 7 8 9 10 11 12 UPDATE t1 SET Column1 =   ( SELECT Columnx    FROM t2    WHERE t2. KEY = ...

  4. html面试题总结

    1.请描述一个网页从开始请求到最终显示的完整过程? 1).在浏览器中输入网址: 2).发送至DNS服务器并获得域名对应的WEB服务器的IP地址: 3).与WEB服务器简历TCP连接: 4).浏览器向W ...

  5. mybatis按datetime条件查询,参数为时间戳时

    mybatis按datetime条件查询,参数为时间戳时,如果数据库为2018-1-1 20:22:10, 你的时间戳也为2018-1-1 20:22:10,但却没找到数据.可能是时差导致的.百度修正 ...

  6. 785. Is Graph Bipartite?

    Given an undirected graph, return true if and only if it is bipartite. Recall that a graph is bipart ...

  7. 基础的Servlet

    1.认识Servlet 今天接触了Servlet,我就写了这篇Servlet的文章.首先,我们了解一下Servlet是什么: 这是百度百科的解释,我个人理解是可以用来前后端交互的一个东西,例如可以实现 ...

  8. Activity 在横竖屏切换情况下的生命周期变化

    title: Activity 在横竖屏切换情况下的生命周期变化 date: 2018-04-26 23:05:57 tags: [Activity] categories: [Mobile,Andr ...

  9. ASP.NET MVC - 启动创建项目,未能加载错误

    VS2012以常规方式创建一ASP.NET MVC internet 项目.创建后F5启动项目,遇一错误: 未能加载文件或程序集“MySql.Web.v20, Version=6.9.4.0, Cul ...

  10. mysql优化建议21条

    转自: http://blog.csdn.net/waferleo/article/details/7179009 今 天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于 ...