转换为B进制中1的个数问题.....
注意 如果在某个B进制位上的数字>1 那么后面的每一位都变成1 (即使全部都为1也不会大于X)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
const int MAXN = 33;
int d[MAXN+10][MAXN+10];
int base[MAXN+10];
int l, r, Len, K, B, ans;
int Cur[MAXN+10];
void init()
{
base[0] = 1; for(int i = 1; i <= MAXN; i++) base[i] = base[i-1] * B;
d[0][0]= 1;
for(int i = 1; i <= MAXN; i++)
for(int j = 0; j <= i; j++)
d[i][j] += d[i-1][j] + d[i-1][j-1];
}
int solve(int x)
{
int Len = 0;
int cnt = 0, ans = 0;
memset(Cur, 0, sizeof(Cur)); Len = 0;
while(x) {
Cur[Len++] = x % B;
x /= B;
}
for(int i = Len-1; i >= 0; i--) {
if(Cur[i] > 1) {
int j = i;
while(j >= 0)
Cur[j--] = 1;
break;
}
}
Len--;
for(int i = Len; i >= 0; i--)
if(Cur[i])
{
if(cnt > K) break;
ans += d[i][K-cnt];
cnt++;
}
if(cnt == K) ans++;
return ans;
}
int main()
{
scanf("%d%d%d%d", &l, &r, &K, &B);
init();
int L = l, R = r;
int ans = solve(R) - solve(L-1);
cout << ans << '\n';
}