题目:小红的k-好数

小红定义一个数是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;
     }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值