题目大意
给出 m , k m,k m,k,找到正整数 n n n满足 n + 1 , n + 2 , ⋯ , 2 n n+1,n+2,\cdots,2n n+1,n+2,⋯,2n中恰好有 m m m个数在二进制下恰好有 k k k个 1 1 1。输出满足条件的任意一个 n n n和满足条件的 n n n的数量。
思路要点
二分+数位 d p dp dp。
定义一个 S ( n ) S(n) S(n)表示 n n n的二进制中有几个 1 1 1。考虑一个 d p dp dp数组 f [ n ] [ k ] f[n][k] f[n][k],表示 1 1 1到 n n n中有几个数的二进制中恰好有 k k k个 1 1 1。也就是 f [ n ] [ k ] f[n][k] f[n][k]为 1 1 1到 n n n中 S ( i ) = k S(i)=k S(i)=k的数量。
接着我们得到了一个公式: f [ 2 n ] [ k ] = f [ n ] [ k ] + f [ n ] [ k − 1 ] − [ S ( n ) = = k − 1 ] f[2n][k]=f[n][k]+f[n][k-1]-[S(n)==k-1] f[2n][k]=f[n][k]+f[n][k−1]−[S(n)==k−1]。
现在我们来考虑这个公式是怎么得出的:
首先我们发现 f [ 2 n ] [ k ] f[2n][k] f[2n][k]表示 1 1 1~ 2 n 2n 2n中 S ( i ) = k S(i)=k S(i)=k的数量。它肯定包括了 f [ n ] [ k ] f[n][k] f[n][k],即 1 1 1到 n n n中 S ( i ) = k S(i)=k S(i)=k的数量。我们将 f [ 2 n ] [ k ] f[2n][k] f[2n][k]被分成了两半,一半是 f [ n ] [ k ] f[n][k] f[n][k],另一半就是 n + 1 n+1 n+1到 2 n 2n 2n