【HDU4471】Homework(矩阵快速幂)
【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(矩阵快速幂)的更多相关文章
- HDU 4471 矩阵快速幂 Homework
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4471 解题思路,矩阵快速幂····特殊点特殊处理····· 令h为计算某个数最多须知前h个数,于是写 ...
- 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 ...
- 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)
题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...
- 51nod 算法马拉松18 B 非010串 矩阵快速幂
非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...
- 51nod 1113 矩阵快速幂
题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...
- 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...
- 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 ...
- 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 输 ...
- hdu2604(递推,矩阵快速幂)
题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...
随机推荐
- Linux TCP/IP调优参数 /proc/sys/net/目录
所有的TCP/IP调优参数都位于/proc/sys/net/目录. 例如, 下面是最重要的一些调优参数,后面是它们的含义: /proc/sys/net/core/rmem_default " ...
- MySQL数据库之安装,基本操作
一.基础部分 1.数据库是什么 之前所学,数据要永久保留,比如用户注册的用户信息,都是保存于文件,而文件只能存在于某一台机器上. 如果我们不考虑从文件中读取数据的效率问题,并且假设我们的程序所有的组件 ...
- Java 验证码识别库 Tess4j 学习
Java 验证码识别库 Tess4j 学习 [在用java的Jsoup做爬虫爬取数据时遇到了验证码识别的问题(基于maven),找了网上挺多的资料,发现Tess4j可以自动识别验证码,在这里简单记录下 ...
- Java 分割、合并byte数组
场景:上传文件较大,把存放文件内容byte数组拆分成小的.下载的时候按照顺序合并. 起初觉得挺麻烦的,写完觉得挺简单. 切割: /** * 拆分byte数组 * * @param bytes * 要拆 ...
- Lua学习笔记(7): 模块
模块 模块就像是c语言工程项目目录里的.h.c文件或外部依赖项,为某一个文件的代码提供依赖,其实就是把工作分成几个模块,方便项目的管理,提高开发效率和维护效率 在Lua中,模块其实就是一个表,实现方式 ...
- openstack golang sdk使用
1. go get github.com/gophercloud/gophercloud import ( "github.com/gophercloud/gophercloud" ...
- SQL中NULL的妙用
商品表Products 库房表WarehouseDistrict 库存表WarehouseStock 一般写法 ;WITH stock AS ( SELECT DistrictId, ProductI ...
- 第一次ScrumMeeting博客:团队任务分解
团队任务分解 1. 主要任务 Alpha阶段结束后,我们要实现一个较为简陋的用户系统,并实现资源的上传和下载功能,完成"贡献点"相关内容并进行用户行为观察,以便Beta阶段完善.除 ...
- DoItYourself!
在杨老师的勉励下,我准备开始“自己”写程序.速度很慢,不过在写的过程中对于用到的几个函数更加熟悉.也尝试多学一点,学透一点.遇到不会的函数,语法不清楚的,还是会百度,不过会自己再敲一遍.重复下去. 下 ...
- gitLab服务器搭建+ rundeck自动化部署
git服务器搭建 https://blog.csdn.net/gx_1_11_real/article/details/79406427 rundeck 部署 https://blog.csdn. ...