2
There is a combinatorial formula for computing3
#{x <N| x is natural number with bitcount(x)=k} =4
\sum_{i=0}^k C(p[i], k-i)5
where p[i]=position for i-th 1 in N's binary expression.8
int prime[] = {2, 3, 5, 7, 11, 13, 17, 19};13
void PascalTriangle(int n) {14
for (int i = 0; i <= n; i++) {15
fill(C[i], C[i] + (i + 1), 1);16
for (int j = 1; j <= i / 2; j++) {17
C[i][i - j] = C[i][j] = C[i - 1][j - 1] + C[i - 1][j];22
vector<int> N2p(int N) {25
for (int i = 20; i >= 0; i--) {26
if (bN[i]) p.push_back(i);31
int nums_bitcount(vector<int> &p, int k) {33
for (int i = 0; i < p.size(); i++) {34
int maxIndex = min(p[i], k - i);36
sum += C[p[i]][k - i];42
int nums_bitcount_isPrime(int N) {43
vector<int> p = N2p(N);46
sum += nums_bitcount(p, k);51
int countPrimeSetBits(int left, int right) {52
int L = log2(right + 1) + 1;54
return nums_bitcount_isPrime(right + 1) - nums_bitcount_isPrime(left);