求给定区间 [X,Y] 中满足下列条件的整数个数:这个数恰好等于 K 个互不相等的 B 的整数次幂之和。
例如,设 X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意:
17=24+20
18=24+21
20=24+22
输入格式
第一行包含两个整数 X 和 Y,接下来两行包含整数 K 和 B。
输出格式
只包含一个整数,表示满足条件的数的个数。
数据范围
1≤X≤Y≤231−1,
1≤K≤20,
2≤B≤10
输入样例:
15 20
2
2
输出样例:
3
#include<bits/stdc++.h>
using namespace std;
const int N = 1e2 + 10;
const int K = 35;
//[1 - X]
int res = 0;
int f[K][21];
int l,r,k,b;
void init(){
for(int i = 0;i < K;i ++){
for(int j = 0;j <= i && j < 21;j ++)
if(!j)f[i][j] = 1;
else f[i][j] = f[i - 1][j - 1] + f[i - 1][j];
}
}
int dp(int x){
if(!x)return 0;
vector<int>nums;
while(x)nums.push_back(x % b),x /= b;
int res = 0;
int last = k;
for(int i = nums.size() - 1;i >= 0;i --){
int x = nums[i];
if(last < 0 || last > i + 1)break;
if(x > 1){
if(i >= last)res += f[i][last];
if(i >= last - 1)res += f[i][last - 1];
}
else if(x == 1){
if(i >= last)
res += (f[i][last]);
}
if(x > 1)break;
if(x == 1)last --;
if(!i && last == 0)res ++;
}
return res;
}
int main(){
init();
cin>>l>>r>>k>>b;
cout<<(dp(r) - dp(l - 1))<<endl;
return 0;
}