题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4471

解题思路,矩阵快速幂····特殊点特殊处理·····

令h为计算某个数最多须知前h个数,于是写出方程:

D =

c1 c2 ``` c[h-1] c[h]
1 0 ``` 0 0
0 1 ``` 0 0
0 0   0 0
0 0   1 0

V[x] =

f[x]
f[x-1]
`
`
f[x-h+1]

显然有V[x+1] = D*V[x].D是由系数行向量,一个(h-1)*(h-1)的单位矩阵,和一个(h-1)*1的0矩阵组成。V[x]是一个h行,1列的矩阵。

初始条件为V[m] = (f[m],f[m-1],`````).如果m>h,那么多余的部分不会用到,如果m<h剩下的部分用0取代,相当于人为的添加前项f[0] = 0,f[-1] = 0·····这不会影响结果,而且式子仍然成立。由此计算出V[n],答案就为V[1][1].

其余看一下代码就OK了,还有别人的解题报告,也可以看一下:

链接:

http://www.07net01.com/program/547544.html

我的代码:

 #include<cstdio>
#include<algorithm>
using namespace std;
const int N =;
const int mod = ;
int h;//计算f[x]时最多和前面h个数有关
struct matrix
{
int row,col;
int m[N][N];
void init(int row,int col)
{
this->row = row;
this->col = col;
for(int i=; i<=row; ++i)
for(int j=; j<=col; ++j)
m[i][j] = ;
}
} A,pm[],ans; matrix operator*(const matrix & a,const matrix& b)
{
matrix res;
res.init(a.row,b.col);
for(int k=; k<=a.col; ++k)
{
for(int i=; i<= res.row; ++i)
{
if(a.m[i][k] == ) continue;
for(int j = ; j<=res.col; ++j)
{
if(b.m[k][j] == ) continue;
res.m[i][j] = (1LL *a.m[i][k]*b.m[k][j] + res.m[i][j])%mod;
}
}
}
return res;
} void cal(int x)
{
for(int i=; i<=; ++i)
if(x & (<<i) ) ans = pm[i]*ans;
}
void getPm()
{
pm[] = A;
for(int i=; i<=; ++i)
pm[i] = pm[i-]*pm[i-];
}
struct sp//特殊点
{
int nk,tk;//nk为点的位置,tk为计算nk时和前面tk个数有关
int ck[N];
bool operator<(const sp & o)const//按照nk排序
{
return nk<o.nk;
}
} p[N];
int main()
{
// freopen("in.txt","r",stdin);
int n,m,q,t,f[N],c[N],kase=;
while(~scanf("%d%d%d",&n,&m,&q))
{
for(int i=m; i>; --i) scanf("%d",&f[i]);
scanf("%d",&t);
h =t;
for(int i=; i<=t; ++i) scanf("%d",&c[i]);
for(int i=; i<q; ++i)
{
scanf("%d%d",&p[i].nk,&p[i].tk);
if(p[i].tk > h) h = p[i].tk;
for(int j=; j<=p[i].tk; ++j) scanf("%d",&p[i].ck[j]);
}
sort(p,p+q);
A.init(h,h);
for(int i=; i<=t; ++i) A.m[][i] = c[i];
for(int i=; i<=h; ++i) A.m[i][i-] = ;
getPm();
ans.init(h,);
for(int i = m; i > ; --i) ans.m[i][] = f[i];
int last=m;
for(int i=; i<q; ++i)
{
if( p[i].nk <=last || p[i].nk >n ) continue;
cal( p[i].nk-last-);
last = p[i].nk;
for(int j=; j<=p[i].tk; ++j) A.m[][j] = p[i].ck[j];
for(int j=p[i].tk+; j<=h; ++j) A.m[][j] = ;
ans =A*ans;
}
cal(n-last);
printf("Case %d: %d\n",++kase,ans.m[][]);
}
return ;
}

HDU 4471 矩阵快速幂 Homework的更多相关文章

  1. HDU 2855 (矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855 题目大意:求$S(n)=\sum_{k=0}^{n}C_{n}^{k}Fibonacci(k)$ ...

  2. HDU - 1575——矩阵快速幂问题

    HDU - 1575 题目: A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973.  Input数据的第一行是一个T,表示有T组数据. 每组数据的第一行有n( ...

  3. hdu 1757 (矩阵快速幂) 一个简单的问题 一个简单的开始

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757 题意不难理解,当x小于10的时候,数列f(x)=x,当x大于等于10的时候f(x) = a0 * ...

  4. 随手练——HDU 5015 矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5015 看到这个限时,我就知道这题不简单~~矩阵快速幂,找递推关系 我们假设第一列为: 23 a1 a2 ...

  5. HDU 3802 矩阵快速幂 化简递推式子 加一点点二次剩余知识

    求$G(a,b,n,p) = (a^{\frac {p-1}{2}}+1)(b^{\frac{p-1}{2}}+1)[(\sqrt{a} + \sqrt{b})^{2F_n} + (\sqrt{a} ...

  6. How many ways?? HDU - 2157 矩阵快速幂

    题目描述 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的 ...

  7. HDU 5950 矩阵快速幂

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  8. hdu 1757 矩阵快速幂 **

    一看正确率这么高,以为是水题可以爽一发,结果是没怎么用过的矩阵快速幂,233 题解链接:点我 #include<iostream> #include<cstring> ; us ...

  9. HDU 4686 矩阵快速幂 Arc of Dream

    由式子的性质发现都是线性的,考虑构造矩阵,先有式子,a[i] = ax * a[i-1] + ay; b[i] = bx*b[i-1] +by; a[i]*b[i] = ax*bx*a[i-1]*b[ ...

随机推荐

  1. LTE Module User Documentation(翻译10)——网络连接(Network Attachment)

    LTE用户文档 (如有不当的地方,欢迎指正!) 16 Network Attachment(网络连接)   正如前面章节 Basic simulation program 所述,连接用户到基站时通过调 ...

  2. PHP文本框的值随下拉框改变

    初学PHP,下面是实现文本框内容随下拉框变化的代码实现: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  3. JavaScript的一点自我总结

    学习前端不知不觉都两个月了,从零基础到现在,网页布局没多大问题,就是JS学的很差,有一段时间都怀疑自己是不是选错了.但自我调节后,心态发生了一些变化后,学习也没那么痛苦了.虽然做不到看代码像看初恋那样 ...

  4. Deep Learning 7_深度学习UFLDL教程:Self-Taught Learning_Exercise(斯坦福大学深度学习教程)

    前言 理论知识:自我学习 练习环境:win7, matlab2015b,16G内存,2T硬盘 练习内容及步骤:Exercise:Self-Taught Learning.具体如下: 一是用29404个 ...

  5. Evolutionary Computing: 2. Genetic Algorithm(1)

    本篇博文讲述基因算法(Genetic Algorithm),基因算法是最著名的进化算法. 内容依然来自博主的听课记录和教授的PPT. Outline 简单基因算法 个体表达 变异 重组 选择重组还是变 ...

  6. Python之路 day2 购物车小程序1

    #Author:ersa ''' 程序:购物车程序 需求: 启动程序后,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时 ...

  7. 如何获取有性能问题的SQL

    1.通过用户反馈获取存在性能问题的SQL.   2.通过慢查日志获取存在性能的SQL.   启动慢查日志 slow_query_log=on   set global slow_query_log=o ...

  8. iOS开发UI篇—无限轮播(循环利用)

    iOS开发UI篇—无限轮播(循环利用) 一.无限轮播  1.简单说明 在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动. 在开发的时候,我们通常的做法是使用一个UIScrollV ...

  9. node+mongodb+ionic+cordova

    node + mongodb1,环境 windows 1,install nodejs 2,install npm | cd npmjs node cli.js install -gf1.1 2.no ...

  10. 002 C#学前入门

    2016-01-16 1..Net平台  .Net FrameWork框架.Net FrameWork框架提供了一个稳定的运行环境,:来保障我们.Net平台正常的运转 2.C#语言 c sharp编程 ...