CF821E 【Okabe and El Psy Kongroo】
首先我们从最简单的dp开始
\(dp[i][j]=dp[i-1][j]+dp[i-1][j+1]+dp[i-1][j-1]\)
然后这是一个O(NM)的做法,肯定行不通,然后我们考虑使用矩阵加速
\(\begin{bmatrix} 1\\ 0 \\0\\0\end{bmatrix}\quad\)
鉴于纵坐标很小,考虑全部记录下来。写成一个向量的形式。如上,
第i行的数表示纵坐标为i-1的方案数。
然后我们考虑转移
\(\begin{bmatrix} 1&1&0&0\\1&1&1&0 \\0&1&1&1\\0&0&1&1\end{bmatrix}\quad\)
我们将不考虑线段的转移写成以上形式,然后考虑一下如果有线段影响呢?
我们可以类比得到,上一个矩阵中的边界是3,如果我们人为规定上边界是2的话。转移就成了这个样子
\(\begin{bmatrix} 1&1&0&0\\1&1&1&0 \\0&1&1&0\\0&0&0&0\end{bmatrix}\quad\)
然后我们发现,如果不是上边界和下边界时,matrix[i][i].matrix[i][i-1].matrix[i][i+1]都是1,然后上下边界自己处理就可以了。
然后我们上一个矩阵快速幂就可以了
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const long long mod=1e9+7;
struct node
{
int n,m;
long long base[20][20];
node operator * (const node &a)const
{
node r;
r.n=n,r.m=a.m;
for(int i=0;i<=n;i++) for(int j=0;j<=a.m;j++) r.base[i][j]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=a.m;j++)
for(int k=1;k<=m;k++)
r.base[i][j]=(r.base[i][j]+base[i][k]*a.base[k][j])%mod;
return r;
}
};//矩阵模板
node pas,ans;
long long a[120],b[120],c[120];
node kasumi(long long k)
{
node res;
res.n=res.m=pas.n;
for(int i=0;i<=res.n;i++) for(int j=0;j<=res.m;j++) res.base[i][j]=0;
for(int i=0;i<=res.n;i++) res.base[i][i]=1;
while(k)
{
if(k&1) res=res*pas;
pas=pas*pas;
k>>=1;
}
return res;//快速幂
}
int main()
{
long long n,k;
scanf("%lld%lld",&n,&k);
ans.n=1;ans.m=16;
for(int i=1;i<=16;i++) for(int j=1;j<=16;j++) ans.base[i][j]=0;//读入数据
ans.base[1][1]=1;//处理初始数据
pas.n=16;pas.m=16;
for(int i=1;i<=n;i++) scanf("%lld%lld%lld",&a[i],&b[i],&c[i]);//输入
for(int l=1;l<=n;l++)//然后按照顺序遍历线段
{
for(int i=0;i<=16;i++) for(int j=0;j<=16;j++) pas.base[i][j]=0;//重新清零
for(int i=1;i<=c[l]+1;i++)
{//处理转移数组
if(i!=1) pas.base[i][i-1]=1;
pas.base[i][i]=1;
if(i!=c[l]+1) pas.base[i][i+1]=1;
}
ans=ans*kasumi(min(b[l],k)-a[l]);//快速幂就可以了
}
printf("%lld",ans.base[1][1]);
}
CF821E 【Okabe and El Psy Kongroo】的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 【codeforces 821E】Okabe and El Psy Kongroo
[题目链接]:http://codeforces.com/problemset/problem/821/E [题意] 一开始位于(0,0)的位置; 然后你每次可以往右上,右,右下3走一步; (x+1, ...
- 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 ...
- CF821 E. Okabe and El Psy Kongroo 矩阵快速幂
LINK 题意:给出$n$条平行于x轴的线段,终点$k$坐标$(k <= 10^{18})$,现在可以在线段之间进行移动,但不能超出两条线段的y坐标所夹范围,问到达终点有几种方案. 思路:刚开始 ...
- [codeforces821E]Okabe and El Psy Kongroo
题意:(0,0)走到(k,0),每一部分有一条线段作为上界,求方案数. 解题关键:dp+矩阵快速幂,盗个图,注意ll 关于那条语句为什么不加也可以,因为我的矩阵C,就是因为多传了了len的原因,其他位 ...
- codeforces E. Okabe and El Psy Kongroo(dp+矩阵快速幂)
题目链接:http://codeforces.com/contest/821/problem/E 题意:我们现在位于(0,0)处,目标是走到(K,0)处.每一次我们都可以从(x,y)走到(x+1,y- ...
随机推荐
- Ubuntu 14.04 下安装搜狗输入法,不要删除ibus
今天安装了 sougou输入法.在ubuntu下面,然后网上一般的帖子都是要求你先删除 ibus 但是你删除了ibus之后,就会导系统设置被删除很多设置项,甚至无法打开, 所有你设置ubuntu输入法 ...
- 8086键盘输入实验——《x86汇编语言:从实模式到保护模式》读书笔记07
1.BIOS中断 我们可以为所有中断类型自定义中断处理过程,包括内部中断.硬件中断和软中断. BIOS中断,又称BIOS功能调用,主要是为了方便地使用最基本的硬件访问功能.通常,为了区分针对同一硬件的 ...
- php高手干货【必看】
1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的"函数&quo ...
- WPF 窗体在Alt+Tab中隐藏
问题: 近段时间由于项目上的需求,需要在WPF中使用COM组件,并且由于软件界面设计等等原因,需要将部分控件显示在COM组件之上,由于WindowsFormsHost的一些原因,导致继承在WPF中的W ...
- sqlserver2008 调试存储过程
1.创建所需要调试的存储过程,并执行一下,也就是保存好 ,我要演示的存储过程名是 “usp_Passport_GetNewDepositary” 2.找到存储过程,右键“执行存储过程”,会弹出如下的界 ...
- VueConf 全球首届Vue.js开发者大会资料整理
最近一直关注VueConf全球首届Vue.js开发者大会,现在将此次开发者大会资料整理如下: 一.Vue 2017 现状与展望 [尤雨溪] 在线视频: PPT整理: Vue 2017 现状与展望 ...
- mysql无法连接Can't create a new thread (errno 11)
问题描述: 今天本地navicat连接服务器mysql出错 ,提示ERROR 1135: Can't create a new thread (errno 11); if you are not ou ...
- Java反射机制集中学习
什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言 ...
- asp 日期操作
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> <% Response.Buffer=True Sessi ...
- 【Android】3.0 Android开发环境的搭建(2)——eclipse
1.0模拟机登录后,可能会一直停留在这个界面很久,那就去洗洗澡.睡睡觉.吃吃饭…… 2.0登录后可以在设置中改成中文,这样界面对国人来说比较友好. 3.0 虚拟机首页可以看到有短信息.拨打电话.浏览器 ...