题目:
求给定区间 [X,Y][X,Y] 中满足下列条件的整数个数:这个数恰好等于 KK 个互不相等的 BB 的整数次幂之和。
例如,设 X=15,Y=20,K=2,B=2X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意:
17=24+2017=24+20
18=24+2118=24+21
20=24+2220=24+22
输入格式
第一行包含两个整数 XX 和 YY,接下来两行包含整数 KK 和 BB。
输出格式
只包含一个整数,表示满足条件的数的个数。
数据范围
1≤X≤Y≤231−11≤X≤Y≤231−1,
1≤K≤201≤K≤20,
2≤B≤10
输入样例:
15 20
2
2
输出样例:
3
import java.util.*;
import java.io.*;
public class Main{
static int X,Y,K,B;
static int N=35;
static int[][] f=new int[N][N];
public static void init(){
for(int i=0;i<N;i++){
for(int j=0;j<=i;j++){
if(j==0){
f[i][j]=1;
}else{
f[i][j]=f[i-1][j]+f[i-1][j-1];
}
}
}
}
public static int dp(int x){
if(x==0){
return 0;
}
ArrayList<Integer> list=new ArrayList();
while(x>0){
list.add(x%B);
x=x/B;
}
int res=0,last=0;
for(int i=list.size()-1;i>=0;i--){
int j=list.get(i);
if(j>0){
res+=f[i][K-last];
if(j>1){
if(K-last-1>=0) res+=f[i][K-last-1];
break;
}else{
last++;
if(last>K){
break;
}
}
}
if(i==0&&last==K){
res++;
}
}
return res;
}
public static void main(String[] args)throws Exception{
BufferedReader read=new BufferedReader(new InputStreamReader(System.in));
String[] s=read.readLine().split(" ");
X=Integer.valueOf(s[0]);
Y=Integer.valueOf(s[1]);
K=Integer.valueOf(read.readLine());
B=Integer.valueOf(read.readLine());
init();
System.out.println(dp(Y)-dp(X-1));
}
}