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- ...
随机推荐
- webservice 介绍
Web service 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术. l 采用标准SOAP(Simple Object Access Protocol) 协议 ...
- 读《NoSQL精粹》前三章有感
现在NoSQL很流行,所以买了一本这方面的书,这本书虽然很薄 156页,但是感觉的确是大师的经验之谈,对于自己经验还是很少.无法能完全能心领神会,大师所说的,就像一个人说药苦,你没吃过.再听别人描述也 ...
- vsftpd配置文件解析
对vsftpd配置文件详细解答. 1.默认配置: 1>允许匿名用户和本地用户登陆. anonymous_enable=YES local_enable=YES 2>匿名用户使用的登陆名为f ...
- html和css(一)
简单点来说html和css就是一起连在使用,有了html和css会使网页更加有活力,看起来更加的好看. html是做关于网页标签这一块相当于骨架,更深的还需要另一个来完成,那就是css,相当于向里面加 ...
- MVC Request.UrlReferrer为null
使用情景,登录后返回登录前访问的页面. 这个时候用到了UrlReferrer var returnUrl = HttpContext.Current.Request.UrlReferrer != nu ...
- Android使用主题属性引发的问题
最近在做一个项目的Porting.直接改变了应用的Theme,最没有仔细的检查.结果应用在某些场景下直接就Crash了.还好,通过Log可以看到是在Inflate某个资源的时候出错导致的.通过定位资源 ...
- bootstrap模态框实现相对定位拖拽
1.正常的拖拽是用绝对定位absolute来实现的,可是bootstrap的模态框是用relative,为了统一更改方便,就照着相对定位来实现拖拽效果. $(".modal .modal-h ...
- linux环境下安装jdk(本文示例是jdk1.6.0_45)
第一步:创建一个文件夹安装jdk(虽说地址一般自定义,但是为了方便查找请按照笔者建议目录 ):/usr/java 将jdk-6u45-linux-x64.bin文件放到 /usr/java 文件夹 ...
- Personal Geodatabase - Can't Create New or Open Existing
来自:http://forums.arcgis.com/threads/32110-Personal-Geodatabase-Can-t-Create-New-or-Open-Existing Per ...
- 多线程(七)~join方法的使用
作用:join()方法的作用是等待线程对象销毁. join()方法具有能使线程排队运行的作用,有点类似于同步的效果. join与synchronize的区别: jo ...