c语言sscanf函数的用法是什么
258
2022-09-16
Codeforces 914 C. Travelling Salesman and Special Numbers (dp)
Description
The Travelling Salesman spends a lot of time travelling so he tends to get bored. To pass time, he likes to perform operations on numbers. One such operation is to take a positive integer x and reduce it to the number of bits set to 1 in the binary representation of x. For example for number 13 it’s true that 1310 = 11012 13 10 = 1101 2 He calls a number special if the minimum number of operations to reduce it to 1 is k.He wants to find out how many special numbers exist which are not greater than n. Please help the Travelling Salesman, as he is about to reach his destination!Since the answer can be large, output it modulo 10^9 + 7.
Input
The first line contains integer n (1 ≤ n < 2^1000).The second line contains integer k (0 ≤ k ≤ 1000).Note that n is given in its binary representation without any leading zeros.
Output
Output a single integer — the number of special numbers not greater than n, modulo 10^9 + 7.
Examples input
1102
Examples output
3
题意
我们定义一种操作为将一个正整数变化为它二进制 1 的个数,问在小于等于给定二进制数的正整数中,有多少个数可以经过 k 次操作变化为 1 。
思路
从题中我们可以看到,一次操作可以将一个数变化为其二进制 1 的个数,于是我们设 dp[i] 表示二进制中有 i 个 1 的数需要几次变化才能到达 1 。
显然 dp[i] = dp[getNum(i)] + 1 ,其中 getNum 可以得出 i 二进制 1 的个数。
对于 dp[i] == k-1 的 i ,接下来的工作便是找出小于等于给定数且二进制 1 的个数为 i 的数的数量,直接用组合数很方便可以求得。
AC 代码
#include
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~