CF1152 F. Neko Rules the Catniverse (dp)
题意
一条长为 \(n\) 的数轴,可以从任意整点 \(\in [1, n]\) 出发,假设当前在 \(x\) ,下一步能到达的点 \(y\) 需要满足,\(y\) 从未到过,且 \(1 \le y \le x + m\) ,问长恰好为 \(k\) 的合法路径条数。
数据范围
对于 \(F1\) 有 \(1 \le n \le 10^5, 1 \le k \le \min(n, 12), 1 \le m \le 4\)
对于 \(F2\) 有 \(1 \le n \le 10^9\) 。
题解
比较 \(\text{tricky}\) 的一个题。
考虑我们当前假设经过的路径为 \(v_1, v_2, \cdots, v_p\) ,我们当前可以添加一个 \(x < \min_{i = 1}^{p} \{v_i\}\) 。显然我们是一定可以添加到队尾的,其次我们可以添加到那些 \(v_i \le x + m\) 的前面。
那么我们就得到一个很显然的 \(dp\) 了,考虑从大到小依次考虑每个数填还是不填就能轻松转移了。
具体来说设 \(dp[i][j][sta]\) 为当前在第 \(i\) 个位置,路径长度为 \(j\) ,最后 \(m\) 个位置状压后的状态为 \(sta\) 。
每次转移的时候,如果不填直接转过去,填的话可以转到后 \(m\) 个有 \(1\) 的状态以及队尾,也就是 \(1 + bitcount(sta)\) 。
这样 \(dp\) 刚好每条路都能一一对应上。
对于 \(F1\) 直接 \(\mathcal O(nk2^m)\) 就行了,\(F2\) 考虑利用矩阵快速幂优化到 \(\mathcal O((k2^m)^3 \log n)\) 。(说实话 \(F2\) 没啥意思。。)
代码
#include <bits/stdc++.h>
#define For(i, l, r) for (register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for (register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Rep(i, r) for (register int i = (0), i##end = (int)(r); i < i##end; ++i)
#define Set(a, v) memset(a, v, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define debug(x) cout << #x << ": " << (x) << endl
using namespace std;
template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, T b) { return b > a ? a = b, 1 : 0; }
inline int read() {
int x(0), sgn(1); char ch(getchar());
for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
return x * sgn;
}
void File() {
#ifdef zjp_shadow
freopen ("F1.in", "r", stdin);
freopen ("F1.out", "w", stdout);
#endif
}
const int N = 1e5 + 1e3, K = 14, M = 4, Mod = 1e9 + 7;
int dp[N][K][1 << M];
int main() {
File();
int n = read(), k = read(), m = read();
dp[0][0][0] = 1;
Rep (i, n) For (j, 0, k) Rep (sta, 1 << m) {
(dp[i + 1][j][sta >> 1] += dp[i][j][sta])%= Mod;
int res = dp[i][j][sta] * (1ll + __builtin_popcount(sta)) % Mod;
(dp[i + 1][j + 1][(sta >> 1) | (1 << m - 1)] += res) %= Mod;
}
int ans = 0;
Rep (sta, 1 << m)
(ans += dp[n][k][sta]) %= Mod;
printf ("%d\n", ans);
return 0;
}
CF1152 F. Neko Rules the Catniverse (dp)的更多相关文章
- 【CF1152F】Neko Rules the Catniverse(动态规划)
[CF1152F]Neko Rules the Catniverse(动态规划) 题面 CF 题解 我们先考虑一个需要扫一遍所有位置的做法. 那么状态一定是\(f[i]\)然后什么什么表示考虑到当前第 ...
- Codeforces Round #554 (Div. 2) F2. Neko Rules the Catniverse (Large Version) (矩阵快速幂 状压DP)
题意 有nnn个点,每个点只能走到编号在[1,min(n+m,1)][1,min(n+m,1)][1,min(n+m,1)]范围内的点.求路径长度恰好为kkk的简单路径(一个点最多走一次)数. 1≤n ...
- CodeForces 1152F2 Neko Rules the Catniverse (Large Version)
题目链接:http://codeforces.com/problemset/problem/1152/F2 题目大意 见http://codeforces.com/problemset/problem ...
- CodeForces 1152F1 Neko Rules the Catniverse (Small Version)
题目链接:http://codeforces.com/problemset/problem/1152/F1 题目大意 有 n 个星球,给定限制 m,从 x 星球走到 y 星球的条件是,$1 \leq ...
- CF1153 F. Serval and Bonus Problem(dp)
题意 一个长为 \(l\) 的线段,每次等概率选择线段上两个点,共选出 \(n\) 条线段,求至少被 \(k\) 条线段覆盖的长度期望. 数据范围 \(1 \le k \le n \le 2000, ...
- Codeforces Round #479 (Div. 3) F. Consecutive Subsequence (简单dp)
题目:https://codeforces.com/problemset/problem/977/F 题意:一个序列,求最长单调递增子序列,但是有一个要求是中间差值都是1 思路:dp,O(n)复杂度, ...
- AGC033 D~F——[ 值放到角标的DP ][ 思路+DP ][ 思路 ]
地址:https://atcoder.jp/contests/agc033/ D Complexity dp[ i ][ j ][ k ][ l ] 表示左上角是 ( i , j ) .右下角是 ( ...
- F. Wi-Fi(线段树实现dp)
题:http://codeforces.com/contest/1216/problem/F dp[i][0]:表示第i个位置不装的最小代价 dp[i][1]:表示第i个位置装的最小代价 T1的线段树 ...
- 2014 Super Training #2 F The Bridges of Kolsberg --DP
原题:UVA 1172 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
随机推荐
- &,^,|,的简化计算与理解
(全部和2进制有关 , 凡是2的次方数都是独立数列,都要先分解再计算的,该计算方式仅供手工计算理解,电脑会自动进行换算的) (第二个等号后面为2进制的结果,不够位在前面补0,1为真,0为假) A^ ...
- Javascript 面向对象(共有方法,私有方法,特权方法,静态属性和方法,静态类)示例讲解
一,私有属性和方法 私有方法:私有方法本身是可以访问类内部的所有属性(即私有属性和公有属性),但是私有方法是不可以在类的外部被调用. <script> /* * 私有方法:私有方法本身是可 ...
- Kafka学习资料
博客系列: Apache Kafka简介Apache Kafka安装和使用Apache Kafka核心概念kafka核心组件和流程—控制器kafka核心组件和流程—协调器kafka核心组件和流程—日志 ...
- Vue.js实现后台菜单切换
因为刚初学Vue.js,暂时遇到以下问题,待之后解决 点击父节点,怎么隐藏显示子节点 点击父节点或子节点,切换li的class="active" iframe怎么自适应高度 思路 ...
- MyDAL - 组件适用范围说明
索引: 目录索引 一.组件特性简介: 1.MSIL 底层代码采用 System.Reflection.Emit.Lightweight 类库使用 IL 的方式处理 Model 组装,性能刚刚的~ 2. ...
- Win 10 无法打开内核设备“\\.\Global\vmx86”问题
Win 10操作系统, VMWareWorkstation10 无法打开内核设备"\\.\Global\vmx86": 系统找不到指定的文件.你想要在安装 VMware Works ...
- url获取整理
$_SERVER['DOCUMENT_ROOT']; //网站的根目录 echo $_SERVER['SERVER_NAME']; //当前的服务器域名 echo $_SERVER['HTTP_H ...
- 【夯实shell基础】shell基础面面观
本文地址 点击关注微信公众号 wenyuqinghuai 分享提纲: 1. shell中的函数 2. shell中的数组 3. shell中的变量 4. shell中的运算符 5. Linux的一些命 ...
- time-时间模块
# time模块import time# 时间戳res = time.time() # ***print(res, type(res)) # time.sleep(1) # ***# print(12 ...
- Ubuntu server 16.04的安装 以及配置(服务器版)
1.在电脑上下载最新版本的Ubuntu服务器ISO映像,刻录到CD或创建一个可启动的USB盘. 2.视情况而定,进入到服务器的boot界面,把cd或者usb设置为启动第一项 3.开始安装 1)Ub ...