题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2004

好美妙的矩阵乘。

思考:

0.在一个序列上。所以考虑dp。

1.p<=10,k<=8,所以考虑状压,1表示这一站正有公交车。

2.n<=1e9,考虑矩阵乘优化dp。

3.因为每一步<=p,所以维护长度为p的区间中的当前状态就行了,其他位置肯定全是0。这样也压得下。

实现:

为了不重不漏,需要指定一个顺序一样的东西。

  比如我们可以指定最左边一定得有一辆车,而且每次状态改变一定是这辆车走了。

    转移条件就是(当前状态)<<1 与 (目标状态) 只有一位不同,即( (当前状态)<<1 & (目标状态) )==k-1。

  对称地,我们也可以指定最右边一定得有一辆车,状态改变时是随便位置的一辆车走到了这个位置。

    转移条件略。

  因为只能从左往右走,所以这两种方式比指定中间某个位置一定得有一辆车更优。

更妙的是因为每次移动区间之前都有一个 不与之前重复的 指定位置一定有车,而本次更新出来的状态都是建立在该位置有车的前提上的,所以就能保证每一站都被停过!

每一站都只停一次就是通过区间内有k个1来保证。

最后需要乘一下最初的状态,就是开头有k个1的那个。

  如果我们把开始的右端看作第k个位置,结束就是在第n个位置;而且这样开始和结束的状态就都是000001111111的样子。

  如果从1~(1<<p-1)枚举数字是否合法,则第一个得到的合法状态就是000001111111的样子。

  所以最后乘一个只有[1][1]是1的状态矩阵(初始),再输出[1][1]位置的值(最终)就行啦!因为乘状态矩阵对[1][1]的值无影响,所以不乘也行。

代码:

  合法状态不用算末位是0但有k个1的,因为没人转移给它们值,所以它们就没用了。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=,mod=;
int n,m,p,cnt,lm,list[N];
struct Matrix{
int v[N][N];
void init()
{
for(int i=;i<=cnt;i++)v[i][i]=;
}
Matrix operator *(const Matrix &b)const
{
Matrix tp;memset(tp.v,,sizeof tp.v);
for(int i=;i<=cnt;i++)
for(int j=;j<=cnt;j++)
for(int k=;k<=cnt;k++)
(tp.v[i][j]+=v[i][k]*b.v[k][j])%=mod;
return tp;
}
}res,tp;
int num(int x)//很好
{
int ct=;
while(x){x-=(x&-x);ct++;}
return ct;
}
int main()
{
scanf("%d%d%d",&n,&m,&p);
lm=(<<p);
for(int i=;i<lm;i++)
if((i&)&&num(i)==m)list[++cnt]=i;
for(int i=;i<=cnt;i++)
for(int j=;j<=cnt;j++)
if(num(list[i]&(list[j]<<))==m-)tp.v[i][j]=;
int ct=n-m;res.init();
while(ct)
{
if(ct&)res=res*tp;
tp=tp*tp;ct>>=;
}
printf("%d",res.v[][]);
return ;
}

bzoj2004公交线路的更多相关文章

  1. bzoj2004公交线路——DP+矩阵加速递推

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 求方案数,想到DP: 因为两个站间距离<=p,所以每p个站中所有车一定都会停靠至 ...

  2. 【BZOJ2004】公交线路(动态规划,状态压缩,矩阵快速幂)

    [BZOJ2004]公交线路(动态规划,状态压缩,矩阵快速幂) 题面 BZOJ 题解 看到\(k,p\)这么小 不难想到状态压缩 看到\(n\)这么大,不难想到矩阵快速幂 那么,我们来考虑朴素的\(d ...

  3. 【BZOJ2004】[Hnoi2010]Bus 公交线路 状压+矩阵乘法

    [BZOJ2004][Hnoi2010]Bus 公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1 ...

  4. 【BZOJ2004】[HNOI2010]Bus 公交线路

    [BZOJ2004][HNOI2010]Bus 公交线路 题面 bzoj 洛谷 题解 $N$特别大$P,K$特别小,一看就是矩阵快速幂+状压 设$f[S]$表示公交车状态为$S$的方案数 这是什么意思 ...

  5. AMap公交线路查询

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...

  6. Android百度地图开发(五)公交线路详情搜索、多条线路显示

    一.公交线路详情检索 获取公交线路的详情主要分来两步,1.获取公交线路的Uid,2.通过Uid获取公交线路详情. 1.获取公交线路的Uid: /* * 获得公交线路图的Uid,并且根据系Uid发起公交 ...

  7. 济南最新公交线路一览(BRT)

    济南最新公交线路一览(BRT) 济南BRT1路 高速公交线路 黄岗路东5:30-21:30 全福立交桥西5:30-21:30 票价1元,刷卡9折,月票有效 高速公交公司 去程:黄岗路东(BRT) - ...

  8. 公交线路免费api接口代码

    描写叙述:本接口主要是依据城市名称 +  线路名称 模糊查找城市公交线路信息. 开源api接口:http://openapi.aibang.com/bus/lines?app_key=keyvalue ...

  9. 【百度地图API】如何制作公交线路的搜索?如331路

    原文:[百度地图API]如何制作公交线路的搜索?如331路 摘要: 从A点到B点的公交导航大家都知道怎么做了,那么单独查询331路公交车的公交路线,如何制作呢?我们一起来学习一下~ --------- ...

随机推荐

  1. StringBuffer类的常用方法

    StringBuffer类和String一样,也用来代表字符串.只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存 ...

  2. Python3基础 raise + 指定类型异常+异常的解释 产生特定类型异常

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  3. Ubuntu 16.04+1080Ti机器学习基本环境配置【转】

    本文转载自:https://blog.csdn.net/MahoneSun/article/details/80808930 一.设置网络 机器有两张网卡,将当前正在使用的“有线连接1”配置为以下的设 ...

  4. HDU 6315 Naive Operations(线段树+区间维护)多校题解

    题意:a数组初始全为0,b数组题目给你,有两种操作: 思路:dls的思路很妙啊,我们可以将a初始化为b,加一操作改为减一,然后我们维护一个最小值,一旦最小值为0,说明至少有一个ai > bi,那 ...

  5. 解决 Faster R-CNN 图片中框不在一张图片上显示的问题

    目录 解决 Faster R-CNN 图片中框不在一张图片上显示的问题 发现问题 如何解决这个问题? 参考issues 解决 Faster R-CNN 图片中框不在一张图片上显示的问题 发现问题 在使 ...

  6. vim 安装molokai主题

    在.vim文件夹下创建文件夹colors 进入 https://github.com/tomasr/molokai 下载molokai.vim 将其放入colors文件夹下 进入.vimrc中 添加 ...

  7. 将keras模型在django中应用时出现的小问题——ValueError: Tensor Tensor("dense_2/Softmax:0", shape=(?, 8), dtype=float32) is not an element of this graph.

    本文原出处(感谢作者提供):https://zhuanlan.zhihu.com/p/27101000 将keras模型在django中应用时出现的小问题 王岳王院长 10 个月前 keras 一个做 ...

  8. SNMP:使用net-snmp捕捉trap

    管理端:172.18.0.135  win7系统     代理端:172.18.0.212    Debian7.2 前提:代理端已配置snmp,可正常实现用SNMP协议实现系统信息监控 1.管理端下 ...

  9. Linux命令详解-echo

    echo会将输入的字符串送往标准输出.输出的字符串间以空白字符隔开,并在最后加上换行号. 1.命令格式: file [ -bchikLnNprsvz ] [ -f namefile ] [ -F se ...

  10. UVA-11613 Acme Corporation (最大费用最大流+拆点)

    题目大意:有一种商品X,其每每单位存放一个月的代价I固定.并且已知其每月的最大生产量.生产每单位的的代价.最大销售量和销售单价,还已知每个月生产的X能最多能存放的时间(以月为单位).问只考虑前m个月, ...