题目链接:http://codeforces.com/contest/821/problem/E

题意:我们现在位于(0,0)处,目标是走到(K,0)处。每一次我们都可以从(x,y)走到(x+1,y-1)或者(x+1,y)或者(x+1,y+1)三个位子之一。

现在一共有N段线段,每条线段都是平行于X轴的。我们如果此时x是在这段线段之内的话,我们此时走到的点(x,y)需要满足0<=y<=Ci.

现在保证一段线段的终点,一定是下一段线段的起点。问我们从起点走到终点的行走方案数。

题解:简单的dp+矩阵快速幂的模版

显然如果k很小是个很简单的dp,dp[i][j]=dp[i-1][j]+dp[i-1][j-1]+dp[i-1][j+1]。但是k很大所以就要用到矩阵快速幂,一般像这种递推方程式都是可以化为用矩阵来求的

dp[1]  110000000000000  predp[1]

dp[2]  111000000000000  predp[2]

dp[3]  011100000000000  predp[3]

dp[4]  001110000000000  predp[4]

.

.

.

dp[15]  000000000000011  predp[15]

#include <iostream>
#include <cstring>
#include <cstdio>
#define mod 1000000007
using namespace std;
typedef long long ll;
struct Matrix {
ll dp[17][17];
};
Matrix Mul(Matrix a , Matrix b , ll Max) {
Matrix c;
memset(c.dp , 0 , sizeof(c.dp));
for(ll i = 0 ; i <= Max ; i++) {
for(ll j = 0 ; j <= Max ; j++) {
for(int k = 0 ; k <= Max ; k++) {
c.dp[i][j] += ((a.dp[i][k]) % mod * (b.dp[k][j]) % mod) % mod;
c.dp[i][j] %= mod;
}
}
}
return c;
}
Matrix Matrix_quick_pow(Matrix a , ll k , ll Max) {
Matrix res;
memset(res.dp , 0 , sizeof(res.dp));
for(ll i = 0 ; i <= Max ; i++) res.dp[i][i] = 1;
while(k) {
if(k & 1) res = Mul(res , a , Max);
k >>= 1;
a = Mul(a , a , Max);
}
return res;
}
int main() {
ll n , k;
scanf("%lld%lld" , &n , &k);
Matrix ans , ope , pre;
memset(ope.dp , 0 , sizeof(ope.dp));
memset(pre.dp , 0 , sizeof(pre.dp));
for(int i = 0 ; i < 16 ; i++) {
if(i == 0) {
ope.dp[i][i] = 1;
ope.dp[i][i + 1] = 1;
}
else if(i == 15) {
ope.dp[i][i] = 1;
ope.dp[i][i - 1] = 1;
}
else {
ope.dp[i][i] = 1;
ope.dp[i][i + 1] = 1;
ope.dp[i][i - 1] = 1;
}
}
pre.dp[0][0] = 1;
for(int i = 1 ; i <= n ; i++) {
ll a , b , Max , flag = 0;
scanf("%lld%lld%lld" , &a , &b , &Max);
if(b > k) {b = k , flag = 1;}
ans = Matrix_quick_pow(ope , b - a , Max);
for(ll j = Max + 1 ; j < 16 ; j++) pre.dp[j][0] = 0;
ans = Mul(ans , pre , Max);
for(ll j = 0 ; j <= Max ; j++) {
pre.dp[j][0] = ans.dp[j][0];
}
if(flag) break;
}
printf("%lld\n" , ans.dp[0][0]);
return 0;
}

codeforces E. Okabe and El Psy Kongroo(dp+矩阵快速幂)的更多相关文章

  1. Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo DP+矩阵快速幂加速

    E. Okabe and El Psy Kongroo     Okabe likes to take walks but knows that spies from the Organization ...

  2. Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo dp+矩阵快速幂

    E. Okabe and El Psy Kongroo   Okabe likes to take walks but knows that spies from the Organization c ...

  3. Codeforces 821E Okabe and El Psy Kongroo(矩阵快速幂)

    E. Okabe and El Psy Kongroo time limit per test 2 seconds memory limit per test 256 megabytes input ...

  4. Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】

    题意: 有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k. 分 ...

  5. Codeforces 821E Okabe and El Psy Kongroo

    题意:我们现在位于(0,0)处,目标是走到(K,0)处.每一次我们都可以从(x,y)走到(x+1,y-1)或者(x+1,y)或者(x+1,y+1)三个位子之一.现在一共有N段线段,每条线段都是平行于X ...

  6. Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo 矩阵快速幂优化dp

    E. Okabe and El Psy Kongroo time limit per test 2 seconds memory limit per test 256 megabytes input ...

  7. [codeforces821E]Okabe and El Psy Kongroo

    题意:(0,0)走到(k,0),每一部分有一条线段作为上界,求方案数. 解题关键:dp+矩阵快速幂,盗个图,注意ll 关于那条语句为什么不加也可以,因为我的矩阵C,就是因为多传了了len的原因,其他位 ...

  8. bnuoj 34985 Elegant String DP+矩阵快速幂

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...

  9. HDU 5434 Peace small elephant 状压dp+矩阵快速幂

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant  Accepts: 38  Submissions: ...

随机推荐

  1. main方法中注入Spring bean

    在有些情况下需要使用main使用Spring bean,但是main方法启动并没有托管给Spring管理,会导致bean失败,报空指针异常. 可以使用 ClassPathXmlApplicationC ...

  2. java基础精选题

    Integer比较 看下面这段有意思的代码,对数字比较敏感的小伙伴有没有发现异常? public static void main(String[] args) { Integer a = 128,b ...

  3. java学习-NIO(五)NIO学习总结以及NIO新特性介绍

    我们知道是NIO是在2002年引入到J2SE 1.4里的,很多Java开发者比如我还是不知道怎么充分利用NIO,更少的人知道在Java SE 7里引入了更新的输入/输出 API(NIO.2).但是对于 ...

  4. Meta 用法汇总

    本文引自: http://blog.csdn.net/MR_LP/article/details/53607087 什么是 meta ? meta 是html语言head区的一个辅助性标签.也许你认为 ...

  5. JavaFx应用 星之小说下载器

    星之小说下载器 说明: 需要jdk环境 目前只支持铅笔小说网,后续添加更多书源,还有安卓版,敬请期待. 喜欢的话,不妨打赏一波! 软件交流QQ群:690380139 断点下载暂未实现,小说下载途中,一 ...

  6. AutoCAD C#二次开发

    https://www.cnblogs.com/gisoracle/archive/2012/02/19/2357925.html using System; using System.Collect ...

  7. Microsoft Access数据库操作类(C#)

    博文介绍的Microsoft Access数据库操作类是C#语言的,可实现对Microsoft Access数据库的增删改查询等操作.并且该操作类可实现对图片的存储,博文的最后附上如何将Image图片 ...

  8. canvas 鼠标位置缩放图形

    最近再做 webcad , 需要在 canvas  上对图形进行缩放,主要分为以下几个步骤: 1.找到当前光标所在位置,确定其在相对 canvas 坐标系的坐标 绑定鼠标滚轮事件,假定每次缩放比例 0 ...

  9. 访问CGI程序时不添加 /cgi-bin/ 目录也可访问

    配置如下 <VirtualHost *:80> DocumentRoot D:\web_root\test ServerName www.test.com <Directory /& ...

  10. Django-用户-组-权限

    前言 RBAC(Role-Based Access Control,基于角色的访问控制)就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角 ...