Gravatar
lihaoze
积分:1315
提交:357 / 748

Pro862  二进制数01串

我们用 $f_{i,j}$ 表示 满足“前 $i$ 个含 $1$ 的数量不大于 $j$”的数的个数,相当于求组合数 ${i \choose j}$,即

$ f_{i, j} = f_{i-1, j} + f_{i-1, j-1} $

处理完动态规划的计算之后,我们从第 $n$ 位(即从右开始数第 $n$ 位)开始,如果 “前 $i-1$ 个含 $1$ 的数量不大于 $L$”的数的个数” 大于序数 $I$ (即 $f_{i-1, L} \ge I$),那么我们输出 $0$,否则输出 $1$ (想一想,为什么)

不难理解,如果一个数的位数大于另一个数的位数,那么这个数一定大于另一个数(废话)。

那么前 $i-1$ 既然已经大于序数 $I$ 了,那么答案对应的数一定小于当前位取 $1$ 时候的数,所以当前位取 $0$。反过来同理。

输出完一位之后序数 $I$ 应减去对应的 $f_{i-1, L}$,并且确定完一位是 $1$ 之后,$1$ 的数量 $L$ 也应减一。即 

$I \gets I - f_{i-1, L}$, $L \gets L - 1$


2022-04-08 13:45:12    
我有话要说
暂无人分享评论!