BZOJ 2004|HNOI 2010 Day 1|公交线路|状态压缩动态规划|矩阵乘法
2016-03-08 23:53
253 查看
公交线路
小 Z 所在的城市有 N 个公交车站,排列在一条长为 N−1 公里的直线上,从左到右依次编号为 1 到 N,相邻公交车站间的距离均为 1 公里。
作为公交车线路的规划者,小 Z 调查了市民的需求,决定按以下规则设计线路:
1. 设共有K 辆公交车,则 1 到 K 号车站作为始发站,N−K+1 到 N号车站作为终点站。
2. 每个车站必须被一辆且仅一辆公交车经停(始发站和终点站也算被经停)。
3. 公交车只能从编号较小的车站驶向编号较大的车站。
4. 一辆公交车经停的相邻两个车站间的距离不得超过 P 公里。
注意“经停”是指经过并停车,因经过不一定会停车,故经停与经过是两个不同的概念。
在最终确定线路之前,小 Z 想知道有多少种满足要求的方案。由于答案可能很大,你只需求出
答案对 30031 取模的结果。
输入
输入文件只有一行,其中包含用空格隔开的三个正整数N, K,P,分别表示公交车站数,公交车数,一辆公交车经停的相邻两个车站间的最大距离。输入的数据保证40%的数据满足N≤1000。100%的数据满足1<N<109,1<P≤10,K<N,1<K≤P
输出
输出文件仅包含一个整数,表示满足要求的方案数对 30031 取模的结果。样例
sample input 1
10 3 3
sample output 1
1
sample input 2
5 2 3
sample output 2
3
sample input 3
10 2 4
sample output 3
81
样例解释
样例一满足要求的方案只有1种,即:(1,4,7,10),(2,5,8),(3,6,9)。样例二满足要求的方案有3种,即:(1,3,5),(2,4);(1,3,4),(2,5)和(1,4),(2,3,5)。题解
不看数据范围不会做系列。。发现P很小但N很大,于是状压。。
令
f[i][state]表示从i开始连续P个位置的状态为state的方案数。那么状态转移方程很显然。然后初始状态是
f[1][{1~k号车站存在,k+1~p号车站不存在}],至于目标状态,为了简化情况,定为
f[n-k+1][{1~k号车站存在,k+1~p号车站不存在}],当然目标状态写到
f[n-p+1]也可以,代码稍长点就是了。。
#include <cstdio> #include <cstring> #define rep(i,j,k) for(int i=j;i<k;++i) const int N = 155, P = 30031; int s = 0, state ; struct Matrix { int c ; Matrix(int x = 0) { memset(c, 0, sizeof c); rep(i,0,s) c[i][i] = x; } friend Matrix operator* (const Matrix &a, const Matrix &b) { Matrix c; rep(k,0,s) rep(i,0,s) rep(j,0,s) (c.c[i][j] += a.c[i][k] * b.c[k][j]) %= P; return c; } friend Matrix operator^ (Matrix a, int b) { Matrix c(1); for (; b; b /= 2, a = a * a) if (b & 1) c = c * a; return c; } }; int count_bit(int x) { int s = 0; for (; x; x -= x & -x) ++s; return s; } bool check(int x, int y) { x >>= 1; int t = x ^ y; return t == (t & -t); } int main() { int n, k, p, x; scanf("%d%d%d", &n, &k, &p); for(int i=1;i<(1<<p);i+=2) if (count_bit(i) == k) { state[s] = i; if (i == (1 << k) - 1) x = s; ++s; } Matrix a, b; rep(i,0,s) rep(j,0,s) if (check(state[i], state[j])) a.c[i][j] = 1; b.c[0][x] = 1; printf("%d", (b * (a ^ (n - k))).c[0][x]); return 0; }
相关文章推荐
- typedef
- gb
- 基础之Intent向下,向上一个活动个传递数据
- Hibernate的双向N-N关联(六)
- Android基础UI之ListView注意点
- 32.Oracle深度学习笔记——LogMiner使用
- Apple Pay 详细教程
- 关于一个很好的google play营销网站
- stm32f407启动文件分析
- 148. Sort List
- 【ios】关于UIImageView的一个坑
- 手机QQ访问时,html页面在QQ中自定义预览和自定义分享
- 关于线程的一些概念和关于线程返回值的简单示例代码
- 软件测试技术 作业2
- Jquery.Datatables dom表格定位
- 关于动软一些规则,为了方便记住,所以抄了些下来
- Java集合之LinkedHashMap
- android中的文件操作详解以及内部存储和外部存储
- zhu的工作日记:LayoutAnimation的简单使用(android)
- 不要对td设置position样式