【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: ...
随机推荐
- iOS 关于权限设置的问题
在info.plist文件下添加 <key>NSContactsUsageDescription</key> <string>请求访问通讯录</st ...
- Windows下MongoDB优化及问题处理
1.MongoDB 服务器CPU占用100% 给Mongodb对应数据库中的表建立索引,这里我采用使用工具:NoSQL Manager for MongoDB 直接在表的属性栏,选择Indexes,右 ...
- spring 属性文件加载接口---PropertySourceLoader
org.springframework.boot.config Interface PropertySourceLoader 实现类: PropertiesPropertySourceLoader, ...
- 阿里云服务器Centos上Apache安装SSL证书配置Https
首先我们先去阿里云申请一个免费的SSL证书(https://common-buy.aliyun.com/?spm=5176.7968328.1266638..5e971232BzMSp5&co ...
- Paper Reading - Mind’s Eye: A Recurrent Visual Representation for Image Caption Generation ( CVPR 2015 )
Link of the Paper: https://ieeexplore.ieee.org/document/7298856/ A Correlative Paper: Learning a Rec ...
- 原生js和jquey获取窗口宽高,滚动条,鼠标位置总结
JQuery获取浏览器窗口的可视区域高度和宽度,滚动条高度 alert($(window).height()); //浏览器时下窗口可视区域高度 alert($(document).height( ...
- $_SERVER['SCRIPT_FILENAME'] 与 __FILE__ 区别
PHP $_SERVER['SCRIPT_FILENAME'] 与 __FILE__ 的区别 PHP $_SERVER['SCRIPT_FILENAME'] 与 __FILE__ 通常情况下,PHP ...
- USACO 2.3.3 Zero Sum 和为零(深搜枚举)
Description 请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N. 现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白,来将 ...
- 第五周PSP作业
PSP表格: 累积进度条: 折线图: 饼状图:
- Hadoop环境搭建01
根据马士兵老师的Hadoop进行的配置 1.首先列下来需要用到的软件 VirtulBox虚拟机.Centos7系统镜像.xshell.xftp.jdk安装包.hadoop-2.7.0安装包 2.在Vi ...