小红定义一个数是k-好数,当且仅当这个数可以表示为若干个不同的k的幂之和。例如,17是4-好数,因为17=42+40。而8则不是4-好数。小红想知道,在区间[1, r]范围内,共有多少个k-好数?共有q次询问。
输入描述
第一行输入一个正整数q,代表询问的次数。
接下来的q行,每行输入三个正整数l, r, k,代表一次询问。
1≤q≤ 103
1 ≤l,r ≤1012
2≤k ≤109
输出描述
输出q行,每行输出一个整数,对应一次询问。
样例输入
1
15 21 4
样例输出
4
共有4个4-好数:
16= 42
17 =42 +40
20=42+41
21=42+41+40
参考思路
数学题,找到第一个大于等于l的k-好数 num1, 同时找到第一个大于等于r的k-好数 num2。例如题目中的15,21分别对应的是16,21,此时,16=4^2 ,表示为[1,0,0],21=4^2+4^1+4^0,表示为[1,1,1],我们计算这两个二进制数的差值即可。
java代码实现
public static void main(String[] args) { int ll=0;//离l最近的k好数(大于或等于l) int rr=0;//离r最近的k好数(小于或等于l) for (int i=l,i<=r;i++){ String str=toFourString(i); if(str!=null){ ll=Integer.parseInt(str, 2);//表示,str本来就是2进制表示的数,现在输出为十进制的。 break; } } //同上,求出rr;; // 判断下ll和rr; // 如果合理,则结果就是rr-ll+1; } public static String toFourString(int num){ // 进制转换,除以4再取余,最后把余数倒过来 int remain=0;//注意,这里,由于余数是最后系数,而本题要求,系数显然只能为1/0 String str="";//如果是k好数,则输出str while (num>0){ remain=num%4; if(remain!=0&&remain!=1){ str=null; break; } else { str=remain+str; } num/=10; } return str; }