bzoj2004公交线路——DP+矩阵加速递推
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2004
求方案数,想到DP;
因为两个站间距离<=p,所以每p个站中所有车一定都会停靠至少一次,借此设计状态为p个站的停靠状态;
状压一下,1表示有车,0表示没有车,每个状态只有k个1;
这样就可以转移了,后一个状态可以是前一个中的一辆车移动了过来,状态数+=前一个状态;
但这样没有规律,同一个状态中不同的1出现的顺序不同,会导致出现重复;
所以需要人为规定一个顺序,这里设计为p位中最后一位一定为1,也就是最新的站上一定有车,规定了一个状态中的1一定是从前往后一个一个出现这样的顺序,从而避免了重复;
这样规定同时也确保了每个站最后一定都被停靠过;
于是每个状态完全只由上一个状态得来,而每个状态能从哪些状态转移过来也是固定的,所以可以使用矩阵快速幂加速递推;
设初始值ans.a[1][1]=1,表示一开始是前k个车站上有车;
最后输出也是ans.a[1][1],只有后k位上有车这个状态是合法的。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k,p,mod=,f[],ct;
struct Matrix{
int a[][];
Matrix operator * (const Matrix &y) const
{
Matrix x;
memset(x.a,,sizeof x.a);
for(int i=;i<=ct;i++)
for(int k=;k<=ct;k++)
for(int j=;j<=ct;j++)
(x.a[i][j]+=a[i][k]*y.a[k][j])%=mod;
return x;
}
}s,ans;
int calc(int x)
{
int s=;
while(x){s++;x-=(x&-x);}
return s;
}
void init()
{
int tt=(<<p)-;
for(int i=;i<=tt;i++)
if(calc(i)==k&&(i&)==)f[++ct]=i; for(int i=;i<=ct;i++)
for(int j=;j<=ct;j++)
if(calc((f[i]<<)&f[j])==k-)
s.a[j][i]=;
}
int main()
{
scanf("%d%d%d",&n,&k,&p);
init();
int t=n-k;
ans.a[][]=;
while(t)
{
if(t&)ans=s*ans;
s=s*s;
t>>=;
}
printf("%d",ans.a[][]%mod);
return ;
}
bzoj2004公交线路——DP+矩阵加速递推的更多相关文章
- luogu题解 P1707 【刷题比赛】矩阵加速递推
题目链接: https://www.luogu.org/problemnew/show/P1707 分析: 洛谷的一道原创题,对于练习矩阵加速递推非常不错. 首先我们看一下递推式: \(a[k+2]= ...
- 矩阵经典题目七:Warcraft III 守望者的烦恼(矩阵加速递推)
https://www.vijos.org/p/1067 非常easy推出递推式f[n] = f[n-1]+f[n-2]+......+f[n-k]. 构造矩阵的方法:构造一个k*k的矩阵.当中右上角 ...
- [HDU2294] Pendant - 矩阵加速递推
Pendant Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- [模板][题解][Luogu1939]矩阵乘法加速递推(详解)
题目传送门 题目大意:计算数列a的第n项,其中: \[a[1] = a[2] = a[3] = 1\] \[a[i] = a[i-3] + a[i - 1]\] \[(n ≤ 2 \times 10^ ...
- 【csp模拟赛3】bridge.cpp--矩阵加速递推
题目描述 穿越了森林,前方有一座独木桥,连接着过往和未来(连接着上一题和下一题...). 这座桥无限长. 小 Q 在独木桥上彷徨了.他知道,他只剩下了 N 秒的时间,每一秒的时间里,他会向 左或向右移 ...
- HDU 5950 - Recursive sequence - [矩阵快速幂加速递推][2016ACM/ICPC亚洲区沈阳站 Problem C]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with ...
- CH 3401 - 石头游戏 - [矩阵快速幂加速递推]
题目链接:传送门 描述石头游戏在一个 $n$ 行 $m$ 列 ($1 \le n,m \le 8$) 的网格上进行,每个格子对应一种操作序列,操作序列至多有 $10$ 种,分别用 $0 \sim 9$ ...
- POJ3070 Fibonacci(矩阵快速幂加速递推)【模板题】
题目链接:传送门 题目大意: 求斐波那契数列第n项F(n). (F(0) = 0, F(1) = 1, 0 ≤ n ≤ 109) 思路: 用矩阵乘法加速递推. 算法竞赛进阶指南的模板: #includ ...
- HDU 1757 矩阵快速幂加速递推
题意: 已知: 当x<10时:f(x)=x 否则:f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + --+ a9 * f(x-10); 求:f(x ...
随机推荐
- T2602 最短路径问题 codevs
http://codevs.cn/problem/2602/ 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 平面上有n个点(n& ...
- centos6安装概述
1.1.选择安装类型:[Install or upgrade an existing system]安装或升级现有系统 1.2.介质校验:[Skip]跳过介质校验,校验时间较长 1.3.语言选择:[E ...
- [Bzoj3205][Apio2013]机器人(斯坦纳树)(bfs)
3205: [Apio2013]机器人 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 977 Solved: 230[Submit][Status] ...
- LeetCode第一题以及时间复杂度的计算
问题描述:给定一组指定整数数组,找出数组中加和等于特定数的两个数. 函数(方法)twoSum返回这两个数的索引,index1必须小于index2. 另外:你可以假设一个数组只有一组解. 一个栗子: I ...
- Ubuntu 16.04安装JAD反编译工具(Java)
JAD反编译工具有个好处,就是字节码和源代码一起输出. 官网:https://varaneckas.com/jad/ 安装步骤: 1.下载: 离线版本:(链接: https://pan.baidu.c ...
- centos6.5编译安装gearmand Job Server(C)
1)下载安装包: wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz 2)安装编译器: yu ...
- ngnix
nginx的平滑重启 博客分类: nginx nginx平滑重启 在研发过程中,修改nginx的配置文件nginx.conf是很平常的事,需要重启nginx.如果我们直接reload是有一定风险的, ...
- WebService Get/Post/Soap 方式请求
import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.InputStream; im ...
- vim note (1)
'vim' go into the vim mode 'i' 'a' 's' is means insert mode 'v' is means visual mode 'esc' is mea ...
- 第04章-VTK基础(2)
[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934- ...