#include<bits/stdc++.h> usingnamespace std; constint N = 35; int k, B; //B进制数 int C[N][N]; //预处理组合数 voidinit() { for (int i = 0; i < N; ++i) for (int j = 0; j <= i; ++j) if (!j) C[i][j] = 1; else C[i][j] = C[i - 1][j] + C[i - 1][j - 1]; } //计算0到n中的数 intdp(int n) { if (!n) return0; vector<int> nums; while (n) nums.push_back(n % B), n /= B;
int res = 0; int last = 0; for (int i = nums.size() - 1; i >= 0; --i) { int x = nums[i]; //求左边分支 if (x) { res += C[i][k - last]; if (x > 1) { if (k > last) res += C[i][k - last - 1]; break; } else { last++; if (last > k) break; } } //加上最右侧分支上的方案 if (!i && last == k) res++; } return res; } intmain() { init(); int l, r; cin >> l >> r >> k >> B; cout << dp(r) - dp(l - 1) << endl; return0; }