给定一个数 ,问有多少个数对 ,满足 且 , 为 二进制表示下 的个数。
Constraints
Solution
(在打模拟赛时写到的题目……好像写了一种跟所有人都不一样的写法)
首先考虑一个数 ,我们需要统计满足 且 的 的个数。考虑数位 ,将 转为二进制形式,从低位往高位推。假设当前在第 位,从第 位到第 位共有 个 :若当前位为 ,则直接跳过进行下一位的统计;否则钦定当前要统计进答案的数字的比第 位高的位置与 相同,且第 位为 ,则此时最低的第 位至少要有 个 ,可任意选取,即需要统计进答案里的方案数为 ,令 ,则公式简化为 。
现在我们需要统计总答案,且因为 很大,无法直接枚举。考虑将 转成二进制形式,共有 位, 为 在二进制下第 位上的数字。统计每一个 被统计进答案的贡献。若 会在数字 时被统计进答案里, 需要满足以下几个条件:1. ,2. 的第 位为 ,3. 的前 位恰好有 个 。答案转化为统计满足条件的 的个数。
我们递推一个数组 , 表示数值小于等于 最低的 位,且二进制下恰好含有 个 的数字的方案数。可得:
特殊的, 。然后就可以数位 出对于每一个 的组合,所有符合条件的数 了。
枚举当前在第 位,前 位总共有 个 ,我们令 ,即大于第 位的部分的 到 的方案,则 的系数 计算方式如下:
然后就可以得到最终的答案了。
Code
1 |
|