专栏文章

[NOIP2021 T2] 数列 题解

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minsckff
此快照首次捕获于
2025/12/02 07:33
3 个月前
此快照最后确认于
2025/12/02 07:33
3 个月前
查看原文
这个题的核心思想就是,从小到达向序列中填数,每次找当前枚举的数填了多少,然后考虑把它加到 SS 中的进位问题。
我们用 fi,j,k,lf_{i,j,k,l} 表示状态:
  • ii 表示向序列中填完了 11i1i-1,接下来要填 ii 这个数,也就是我们讨论了 SS 从低到高的第 ii 位。
  • jj 表示序列中有了 jj 个数。
  • kk 表示 SS 中进完位的部分有 kk11
  • ll 表示最后一位还没进上去位的部分:比如说 101111101111 这个数,最高的 22 位的 ll 就是 22(对应进位后的 1010,最高的 33 位的 ll 就是 55(对应展开后的101),以此类推。
我们每次枚举一个已经填好的状态 (i,j,k,l)(i,j,k,l),然后再枚举一个 pp 表示我们填多少个 ii 到序列里面。接下来讨论转移:
  • ii 应该转移到 i+1i+1,因为我们要考虑下一位。
  • jj 应该转移到 j+pj+p,因为我们新加了 pp 个数。
  • 然后是 kk,先考虑 ll 的变化,此时我们的 ll 就变成了 l+pl+p。而我们接下来要填下一位了,所以我们要把第 ii 位进上去,看是否保留 11。这个过程相当于二进制展开,如果最后一位是 11,也就是说 l+pl+p 是奇数,那么我们就让这一位是 11,也就是让 kk 增加 11。因此 kk 会不会增加取决于 l+pl+p 是奇数还是偶数。因此 kk 转移到 k+(l+p)%2k+(l+p)\%2
  • 最后是 ll,我们需要更新进位后还没有进位的部分,因此我们令 ll 转移到 (l+p)/2(l+p)/2
举个例子,如果 SS 当前是 3100013-10001(“-”前面是没进位的部分),如果我们填入 22 个数,那么我们就让这个 33 变成 55,然后再进位,此时 SS 就变成了 21100012-110001
然后我们发现,我们需要计算填入后的数的权值以及序列的数目,因为新序列的权值和就是原序列的权值乘上新序列的权值再乘上新序列的数目fi+1,j+p,k+(l+p)%2,(l+p)/2f_{i+1,j+p,k+(l+p)\%2,(l+p)/2} 加上 kk 倍的 fi,j,k,lf_{i,j,k,l} 来转移。
首先权值是 viv_ikk 次方,然后新序列的种类数需要用到插板法。问题转化为用 jj 个板子分开 pp 个数的方案,中间可以空。所以这部分的答案就是 (j+pp)j+p \choose p。所以最终的式子就是:
fi+1,j+p,k+(l+p)%2,(l+p)/2+=fi,j,k,lvjk(j+pp)f_{i+1,j+p,k+(l+p)\%2,(l+p)/2}+=f_{i,j,k,l}*v_j^k*{j+p \choose p}
我们统计完以后,枚举所有前两位为 n,mn,m 的状态,此时 ll 的贡献是 popcount(l)popcount(l),即 11 的个数就是 k+popcount(l)k+popcount(l)。如果这个数不大于 mmmm 就是 11 的最大个数),那它就是合法方案,我们把它加进 ansans 里面。
这样我们就把这个题做完了。

评论

0 条评论,欢迎与作者交流。

正在加载评论...