• 对模拟的过程不敏感,对范围的数字不敏感

  • 手玩是发现规律的好方式

  • 计数 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 数列 题解的更多相关文章

  1. [HNOI2009]有趣的数列 题解(卡特兰数)

    [HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满 ...

  2. BZOJ1500:[NOI2005]维修数列——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1500 https://www.luogu.org/problemnew/show/P2042#su ...

  3. 洛谷 P4108 / loj 2119 [HEOI2015] 公约数数列 题解【分块】

    看样子分块题应该做的还不够. 题目描述 设计一个数据结构. 给定一个正整数数列 \(a_0, a_1, \ldots , a_{n-1}\),你需要支持以下两种操作: MODIFY id x: 将 \ ...

  4. P1962 斐波那契数列-题解(矩阵乘法扩展)

    https://www.luogu.org/problemnew/show/P1962(题目传送) n的范围很大,显然用普通O(N)的递推求F(n)铁定超时了.这里介绍一种用矩阵快速幂实现的解法: 首 ...

  5. 洛谷P1962 斐波那契数列题解

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...

  6. 洛谷 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 要 ...

  7. 洛谷P2401 不等数列 题解

    可食用的题目链接 题解: 有题目得:这个题有巧做法而不是暴力模拟.废话 这个题看着像一道dp,因为可以由前一种(数据更小的推出数据更大的)推出后一种. 我们设已经得到了n-1个数的总方法(1~n-1) ...

  8. 洛谷 P1438 无聊的数列 题解

    原题链接 首先,我们考虑用差分解决问题. 用 \(x_i\) 表示原数列,\(a_i = x_i - x_{i-1}\) 那么,先普及一下差分: 如果我们只需要维护区间加值,单点求值的话,你会发现两个 ...

  9. P1062 数列 题解

    (题目为啥要强调用十进制输出呢,明明就是故意提醒) 分析一下样例 k=3k=3时,数列为:1,3,4,9,10,12,13..1,3,4,9,10,12,13.. 转换成三进制就是:1,10,11,1 ...

  10. 【HEOI2015】公约数数列 题解(分块)

    前言:毒瘤数据结构题,半个下午都在搞它了…… --------------------------- 题目链接 题目大意:给定一个长度为$n$的序列,有两种操作:1.把$a_x$的值改成$y$.2.求 ...

随机推荐

  1. 端口被占用 for mac

    启用项目提示端口被占用 解决方案: lsof -i : 3010 杀死占用的进程 kill -9 4804 重新启动

  2. 如何用calibredrv 来merge多个cell的gds

    1. 两个cell合并到一个gds calibredrv -shell layout filemerge -in A.gds -in B.gds -out  AB.gds -createtop AB_ ...

  3. labuladong数据结构

    缓存淘汰算法:LRU①.LFU② BST③ 完全二叉树④ 序列化和反序列化二叉树⑤ 最近公共祖先⑥ 单调栈⑦ 单调队列⑧ 递归反转链表⑨ k个一组反转链表

  4. FFT简单概述

    概念 快速傅里叶变换 (fast Fourier transform), 即利用计算机计算离散傅里叶变换(DFT)的高效.快速计算方法的统称,简称FFT.快速傅里叶变换是1965年由J.W.库利和T. ...

  5. DevOps Gitlab环境部署

    DevOps 介绍 目录 DevOps 介绍 一.DevOps 介绍 1.1.1 DevOps 介绍 1.1.2 CI/CD简介 1.1.2 Gitlab安装与使用 一.DevOps 介绍 1.1.1 ...

  6. python扑克牌

    import random import operator def auto(): pokers=[] poker=[] for i in ['','','','']: for j in ['A',' ...

  7. Android studio的使用2

    运行按钮First activity: package com.example.activity;import androidx.appcompat.app.AppCompatActivity;imp ...

  8. redis 配置哨兵模式时出现的问题(redis 版本 6.2.5)

    今天准备搭建一个 redis 集群(redis 版本 6.2.5),在这之前要先配置好哨兵模式. 但是在配置哨兵模式时出现了问题.之前没有搭建集群时(一主两从,三台虚拟机)可以顺利配置好,而搭建集群时 ...

  9. applicationContext使用注解代替

    创建一个类SpringConfig @Configuration//证明这个类是spring的配置文件类 @ComponentScan("com.itheima")//扫描的哪些包 ...

  10. NOI 顺序查找——查找特定的值

    描述 在一个序列(下标从1开始)中查找一个给定的值,输出第一次出现的位置. 输入 第一行包含一个正整数n,表示序列中元素个数.1 <= n <= 10000.第二行包含n个整数,依次给出序 ...