题目链接: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;
}

最新文章

  1. HDOJ 2317. Nasty Hacks 模拟水题
  2. asp.net mvc添加多条数据到数据库
  3. tomcat下的https项目创建与部署
  4. [SAP ABAP开发技术总结]面向对象OO
  5. 【USACO 3.2.2】二进制数01串
  6. 一个封装HTTP请求的函数(C++)
  7. pro-engineer&amp;UG
  8. xmlns=&quot;&quot;
  9. Zepto源码分析(一)核心代码分析
  10. 简陋的swift carthage copy-frameworks 辅助脚本
  11. 【noip模拟】最小点覆盖
  12. java遍历Map
  13. RapidJson 的使用
  14. 关于C++使用将整形转换为字符串进行格式化的问题
  15. ansible-playbook 主机变量1
  16. 18年10月31日 NOIP模拟赛
  17. zoj3822
  18. C语言——循环队列和链队列的基本运算
  19. django项目中关于跨域CORS
  20. 使用 Maven 管理项目

热门文章

  1. Git-命令行-使用 git stash 暂存代码
  2. 【Java例题】2.2 分数类
  3. unity 四叉树管理场景
  4. 逆向破解之160个CrackMe —— 004-005
  5. 关于 java中的换行符
  6. jQuery中的append中含有onClick的问题
  7. android ——活动
  8. 【0806 | Day 9】三张图带你了解数据类型分类和Python深浅拷贝
  9. 神奇的 SQL 之温柔的陷阱 → 三值逻辑 与 NULL !
  10. golang timeoutHandler解析及kubernetes中的变种