题意
问在 [ 0 , 2 b − 1 ] [0, 2^b-1] [0,2b−1]中为k的倍数的数的二进制表达中1的个数。
思路
- g [ i ] [ j ] g[i][j] g[i][j]表示前i位的数中模k为j的数的1的个数,答案为 g [ b ] [ 0 ] g[b][0] g[b][0]
第i位数有两种情况,为0的时候 g [ i ] [ j ] = g [ i − 1 ] [ j ] g[i][j] = g[i-1][j] g[i][j]=g[i−1][j],为1的时候则1的来源分为两种,前i-1位提供的和第i位提供的。前i-1位提供了 g [ i − 1 ] [ j ] g[i-1][j] g[i−1][j]个1,然后前i-1位中有多少个数模k等于j就为第i位提供了多少个1,此时这个数比i-1位的时候多了 2 i 2^i 2i所以他对k的模数变成了