P7961 数列 题解
对模拟的过程不敏感,对范围的数字不敏感
手玩是发现规律的好方式
计数 dp 以及一众计数题是明显短板,需要加紧突破。
样例解释已经较为明显地提示了这道题的大致做法。对于计数题,有动归与组合数学两种方法。但这道题并不是很能推式子,所以采用动态规划。
我们需要统计 \(0\) 到 \(m\) 每个元素的个数,所以要有一维记录当前推到第几个元素。
答案与整数 \(S\) 有较大关联,我们需要一维记录当前递推到 \(S\) 第几位。
发现根据上面两维无法表示 \(1\) 的 数量不超过 \(k\) 个,于是要再开一维表示当前 \(S\) 有几个 \(1\)。
但是由于每个点可以选多次,所以我们只凭这些,最终 \(1\) 的个数还是无法确定。
我们得到了一个半成品数组,\(dp_{i,j,k}\) 表示当前推到第 \(i\) 个元素,推到第 \(j\) 位,当前有 \(k\) 个 \(1\) 的答案。
如果你推到这里卡住了,没有关系。你需要的是查看一众 NOI 拿金游记并睡一觉。
试着根据这个半成品数组设计转移方程,我们发现由于有 \(1\) 的个数存在,并不是很好推这个状态是由哪些状态转移而来得到,但我们只需枚举当前第 \(i\) 个元素选了几个,就可以推出这个状态对后面状态的贡献。通过枚举选了 \(t\) 个,我们可以得出当前的位是 \(0\) 还是 \(1\),但是尽管同样是 \(1\),选 \(1\) 个和选 \(3\) 个还是有很大的不同的。这会影响下一位的值,也许还会影响下下位的。
发现实际上,这个影响取决于进位的多少。所以我们还需要一维,表示当前一位要向后进多少的值。
成品数组产生了:\(dp_{i,j,k,w}\) 表示当前推到第 \(i\) 个元素,推到第 \(j\) 位,当前有 \(k\) 个 \(1\) ,且要向下一位进 \(w\) 的值。显然, \(w\) 最大就是 \(n\),因为当前元素最多选 \(n\) 个。
贡献是多少?\(dp_{i,j,k,w}\) 实际上就是一种方案的权值乘上这种方案产生的序列个数。显然,现有的权值要乘上 \(p_i\)。产生的序列个数就是在选剩的格子里(共 \(n-j\) 个)选 \(t\) 个填上的方案乘上原来的方案。根据结合律可得:
f[i + 1][j + t][w + ((t + p) % 2)][(t + p) / 2] += ((((f[i][j][w][p] * qp[i][t]) % mod) * C[n - j][t]) % mod);
最后统计答案时要注意,第 \(n\) 位的进位也要加以判断。实际上就是求进位数的 popcount ,如果这个和原来的 \(k\) 加起来不大于题目要求才可被统计。
P7961 数列 题解的更多相关文章
- [HNOI2009]有趣的数列 题解(卡特兰数)
[HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满 ...
- BZOJ1500:[NOI2005]维修数列——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1500 https://www.luogu.org/problemnew/show/P2042#su ...
- 洛谷 P4108 / loj 2119 [HEOI2015] 公约数数列 题解【分块】
看样子分块题应该做的还不够. 题目描述 设计一个数据结构. 给定一个正整数数列 \(a_0, a_1, \ldots , a_{n-1}\),你需要支持以下两种操作: MODIFY id x: 将 \ ...
- P1962 斐波那契数列-题解(矩阵乘法扩展)
https://www.luogu.org/problemnew/show/P1962(题目传送) n的范围很大,显然用普通O(N)的递推求F(n)铁定超时了.这里介绍一种用矩阵快速幂实现的解法: 首 ...
- 洛谷P1962 斐波那契数列题解
题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...
- 洛谷 P2401 不等数列 题解
每日一题 day25 打卡 Analysis dp[i][j]=dp[i-1][j-1]*(i-j)+dp[i-1][j]*(j+1); 其中i和j是表示前i个数中有j个小于号,j<=i-1 要 ...
- 洛谷P2401 不等数列 题解
可食用的题目链接 题解: 有题目得:这个题有巧做法而不是暴力模拟.废话 这个题看着像一道dp,因为可以由前一种(数据更小的推出数据更大的)推出后一种. 我们设已经得到了n-1个数的总方法(1~n-1) ...
- 洛谷 P1438 无聊的数列 题解
原题链接 首先,我们考虑用差分解决问题. 用 \(x_i\) 表示原数列,\(a_i = x_i - x_{i-1}\) 那么,先普及一下差分: 如果我们只需要维护区间加值,单点求值的话,你会发现两个 ...
- P1062 数列 题解
(题目为啥要强调用十进制输出呢,明明就是故意提醒) 分析一下样例 k=3k=3时,数列为:1,3,4,9,10,12,13..1,3,4,9,10,12,13.. 转换成三进制就是:1,10,11,1 ...
- 【HEOI2015】公约数数列 题解(分块)
前言:毒瘤数据结构题,半个下午都在搞它了…… --------------------------- 题目链接 题目大意:给定一个长度为$n$的序列,有两种操作:1.把$a_x$的值改成$y$.2.求 ...
随机推荐
- mac 打开活动监视器(任务管理器)
打开方式 1.快捷键 command+option+esc 选择需要强制退出的app 2.通过菜单 需要查看完整的占用率 应用程序=>实用工具=〉活动监视器
- 定长线程池Demo
1 import java.util.concurrent.ExecutorService; 2 import java.util.concurrent.Executors; 3 4 /** 5 * ...
- oracle-11.2.0.4静默安装----RedHat7.5
1.配置/etc/hosts文件和关闭seliux和firewall防火墙 编辑/etc/hosts文件 [root@henry ~]# vim /etc/hosts [root@henry ~]# ...
- 4组-Beta冲刺-1/5
一.基本情况 队名:摸鲨鱼小队 组长博客:https://www.cnblogs.com/smallgrape/p/15590583.html github链接:https://github.com/ ...
- BubbleSort,冒泡排序,C++非递归和递归实现
1 // g++ bubble_sort.cc -Wall -O3 && ./a.exe 2 3 4 #include <iostream> 5 #include < ...
- Python+unittest+requests 接口自动化测试框架搭建 完整的框架搭建过程 实战
一.Python+unittest+requests+HTMLTestRunner 完整的接口自动化测试框架搭建_00--框架结构简解 首先配置好开发环境,下载安装Python并下载安装pycharm ...
- JS数组创建
1.使用Array构造函数 var arr1 = new Array(); //创建一个空数组 var arr2 = new Array(10); // 创建一个包含10项的数组 var arr3 = ...
- The difference of src and href
href是Hypertext Reference的缩写,表示超文本引用.用来建立当前元素和文档之间的链接.常用的有:link.a.例如: <link href="reset.css&q ...
- El_获取域中存储的值和El_获取域中存储的值_对象值
2获取值 1.el表达式只能从域对象中获取值 2语法: 1.$[域名称.键}:从指定域中获取指定键的值域名称:1.pageScope2.requestScope 3.sessionScope 4.ap ...
- Word 给公式添加题注解决交叉引用中包含公式
简记:回车,然后 Ctrl +Alt+Enter https://blog.csdn.net/wsj_jerry521/article/details/115163456