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- ...
随机推荐
- 九度oj题目1521:二叉树的镜像
题目1521:二叉树的镜像 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2061 解决:560 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF ...
- c#-FrameWork01
Framwork ArrayList l 集合类似于数组,同样是用来存放连续数据的,但集合的功能比数组更强大 l 集合和数组的最大区别:数组一旦定义以后就无法改变其大小,而集合可以动态的改变其大小 ...
- 01.里氏准换与using关键字
using关键字有什么用?什么是IDisposable? using可以声明namespace的引入,还可以实现非托管资源的释放,实现了IDisposiable的类在using中创建,using结束后 ...
- 02.switch的使用
基本语法: switch-case语法: switch(表达式/变量) { case 值1: 语句块1; break; case 值2: 语句块2; break; default:语句块3; brea ...
- VS2015自定义类模板的方法
在前一段时间忽然想给自己电脑上的vs新建类的时候添加一个自定义个注释,但是在网上搜了很久都是说vs2012之类的方法系统也都是win7.XP之类的独独没有win8的.故此自己不断的尝试修改发现方法如下 ...
- Android - Rxjava 使用和原理
用RxJava写的一个Android的小Demo 我所理解的RxJava——上手其实很简单 http://www.jianshu.com/p/5e93c9101dc5
- 【代码笔记】XML深入学习:DTD约束与DTD语法(2)
DTD语法之定义实体(了解即可) 实体分为一般实体和参数实体. 定义实体:定义变量 引用实体:使用变量 一般实体:定义实体在DTD中,实体引用在xml中. 参数实体:定义实体在DTD中,实体引用在DT ...
- .NET开源工作流RoadFlow-表单设计-单选按钮组
单选按钮组即:<input type='checkbox'/>控件: 绑定字段:与数据表的某个字段绑定. 数据源: 1.数据字典:在下面字段项中选择对应在数据字典项. 2.自定义:自己输入 ...
- ArcGIS Enterprise 10.5.1 静默安装部署记录(Centos 7.2 minimal)- 6、总结
安装小结 安装完成后,首先我们需要将Datastore托管给Server,再将Server托管给Portal以此来完成整个单机版Enterprise 部署流程.为了测试流程是否正确,我们可以采用上传一 ...
- Android SDK 目录和作用详解
1.add-ons这里面保存着附加库,比如GoogleMaps,当然你如果安装了OphoneSDK,这里也会有一些类库在里面.也可以是厂商自己制作的add-ons.开发中该文件是可选的,如果你没有用到 ...