代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
LL f[35][35];
LL x, y, b;
int pos[35];
int len;
void init()
{
memset(f, 0, sizeof(f));
f[0][0] = 1;
for (int i = 1; i <= 32; i++)
{
f[i][0] = f[i - 1][0];
for (int j = 1; j <= i; j++)
{
f[i][j] = f[i - 1][j - 1] + f[i - 1][j];
}
}
}
LL solve(LL t, LL k)
{
len = 1;
while (t)
{
pos[len++] = t % b;
t /= b;
}
LL ans = 0;
for (int i = len - 1; i >= 1; i--)
{
if (pos[i] > 1)
{
ans += f[i - 1][k] + f[i - 1][k - 1];
break;
}
else if (pos[i] == 1)
{
ans += f[i - 1][k];
k--;
}
if (k < 0)
break;
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
init();
LL k;
while (cin >> x >> y >> k >> b)
{
cout << solve(y + 1, k) - solve(x, k)<< endl;
}
return 0;
}