注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压。

然后状压DP一下,用矩阵快速幂加速运算即可。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm> #define MAXN 140
#define MOD 30031 using namespace std; struct Matrix
{
int num[MAXN][MAXN];
int n,m; //n*m大小矩阵
void setOne(int a,int b)
{
n=a,m=b;
for(int i=;i<=min(n,m);i++) num[i][i]=;
}
Matrix() { memset(num,,sizeof(num)); }
}T,A,one; Matrix operator*(Matrix a,Matrix b)
{
Matrix c;
c.n=a.n,c.m=b.m;
for(int i=;i<=c.n;i++)
for(int j=;j<=c.m;j++)
for(int k=;k<=a.m;k++)
c.num[i][j]=(c.num[i][j]+a.num[i][k]*b.num[k][j])%MOD;
return c;
} Matrix fastPow(Matrix base,int pow)
{
Matrix ans;
ans.setOne(base.n,base.m);
while(pow)
{
if(pow&) ans=ans*base;
base=base*base;
pow>>=;
}
return ans;
} int calc(int x) //计算x的二进制中1的个数
{
int sum=;
while(x)
{
sum++;
x-=x&(-x); //x去掉最后一个1
}
return sum;
} int n,k,p,goal; //goal是目标状态 bool canConvert(int to,int from) //检查状态from能否一步转移到状态to
{
from=(from-(<<(p-)))<<; //这一步相当于把from向左推了一位,个位用0补齐
int tmp=from^to; //tmp应该只有一个1
if(tmp==(tmp&(-tmp))) return true; //tmp只有一个1,则是合法的
return false; //否则是不合法的
} int status[MAXN],top=; //保存所有DP过程中可能出现的状态的栈 int main()
{
scanf("%d%d%d",&n,&k,&p);
for(int S=(<<(p-));S<(<<p);S++) //枚举DP状态S,S是合法状态当且仅当S的二进制中1的个数恰好为k
{
if(calc(S)==k)
{
status[++top]=S;
if(S==(<<p)--((<<(p-k))-)) goal=top; //S是最终要达到的状态
}
}
for(int i=;i<=top;i++)
for(int j=;j<=top;j++)
if(canConvert(status[i],status[j]))
T.num[i][j]=;
A.n=A.m=T.n=T.m=top;
A.num[][goal]=;
T=fastPow(T,n-k);
A=A*T;
printf("%d\n",A.num[][goal]);
return ;
}

BZOJ 2004 公交线路(状压DP+矩阵快速幂)的更多相关文章

  1. 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂

    [题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...

  2. BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )

    状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...

  3. HDU 5434 Peace small elephant 状压dp+矩阵快速幂

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant  Accepts: 38  Submissions: ...

  4. 【bzoj2004】[Hnoi2010]Bus 公交线路 状压dp+矩阵乘法

    题目描述 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计 ...

  5. 『公交线路 状压dp 矩阵乘法加速』

    公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的 ...

  6. [Bzoj2004][Hnoi2010]Bus 公交线路(状压dp&&矩阵加速)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 看了很多大佬的博客才理解了这道题,菜到安详QAQ 在不考虑优化的情况下,先推$dp ...

  7. BZOJ2004 HNOI2010公交线路(状压dp+矩阵快速幂)

    由数据范围容易想到矩阵快速幂和状压. 显然若要满足一辆公交车的相邻站台差不超过p,则每相邻p个站台中每辆车至少经过一个站台.可以发现这既是必要的,也是充分的. 开始的时候所有车是相邻的.考虑每次把一辆 ...

  8. 【XSY2524】唯一神 状压DP 矩阵快速幂 FFT

    题目大意 给你一个网格,每个格子有概率是\(1\)或是\(0\).告诉你每个点是\(0\)的概率,求\(1\)的连通块个数\(\bmod d=0\)的概率. 最开始所有格子的概率相等.有\(q\)次修 ...

  9. 2018.09.28 hdu5434 Peace small elephant(状压dp+矩阵快速幂)

    传送门 看到n的范围的时候吓了一跳,然后发现可以矩阵快速幂优化. 我们用类似于状压dp的方法构造(1(1(1<<m)∗(1m)*(1m)∗(1<<m)m)m)大小的矩阵. 然后 ...

随机推荐

  1. 20155319 2017-2018-1《信息安全系统设计》第四周课堂测试、Makefile、myod

    20155319 2017-2018-1<信息安全系统设计>第四周课堂测试.Makefile.myod 测试2-gcc测试 1.用gcc 进行预处理,编译,汇编,链接vi输入的代码 2.生 ...

  2. 20155333 2016-2017-2 《Java程序设计》第十周学习总结

    20155333 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 网络概览 两台计算机用于通信的语言叫做"协议".我们只需关心应用层中的协 ...

  3. PHP学习笔记之析构函数以及static,self,parent关键字

    引用 $jordan1 = &$jordan; 当jordan1 = null; //此时会直接调用析构函数 而当无&时,就需要等到所有的引用都为null时,才调用析构函数析构  乔丹 ...

  4. 封印解除:如何在Win10家庭版中启用组策略

    @echo off pushd "%~dp0" *.mum >List.txt *.mum >>List.txt for /f %%i in ('findstr ...

  5. 【转载】C/C++杂记:深入理解数据成员指针、函数成员指针

    原文:C/C++杂记:深入理解数据成员指针.函数成员指针 1. 数据成员指针 对于普通指针变量来说,其值是它所指向的地址,0表示空指针.而对于数据成员指针变量来说,其值是数据成员所在地址相对于对象起始 ...

  6. mac php版本切换

    mac os 中自带php版本,但是很多扩展是不带的. 这个网站: http://php-osx.liip.ch/提供了几乎所有的php版本 通过输入 curl -s http://php-osx.l ...

  7. 在 Centos7 用Jexus服务器 运行.Net Core 只需几部

    1.安装 .Net SDK 不需要按照 .net core runtime,sdk 依赖于运行时会自动安装 第一步 添加dotnet源 sudo rpm -Uvh https://packages.m ...

  8. MYSQL查看当前正在使用的数据库命令

    select database();

  9. WPF获取窗口句柄

    通过WPF的互操作帮助类WindowInteropHelper,相关连接:https://msdn.microsoft.com/zh-cn/library/system.windows.interop ...

  10. 配置文件语言之yaml

    一. Yaml YAML 是一种简洁的非标记语言.YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读. 由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用.列一下现 ...