题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4577
这道题一开始想不到怎么做,看到其他人的结题报告知道怎么做了。
这道题另一个特点是大数,用到Java的大数类很方便,也比自己写的C++大数类快
结题报告原文链接: http://blog.csdn.net/shiyuankongbu/article/details/9884777
思路主要是这张图:
根据这个思路我自己写了一下,老是TLE,代码如下:
///2014.5.18
///hdu4577
///2013 ACM-ICPC杭州赛区全国邀请赛 2
import java.math.*;
import java.util.*;
public class Main{
public static void main(String args[]){
BigInteger n,ans,tmp,cnt,num,tmp0;
int k,t;
Scanner cin=new Scanner(System.in);
t=cin.nextInt();
while(t-->0){
n=cin.nextBigInteger();
k=cin.nextInt();
ans=BigInteger.ZERO;
tmp = BigInteger.valueOf(1<<(k-1));
tmp0 = tmp.multiply(BigInteger.valueOf(2));
while(true){
num = n.divide(tmp);
cnt = num.subtract(num.divide(BigInteger.valueOf(2)));
if(cnt.equals(BigInteger.ZERO)) break;
ans = ans.add(cnt);
tmp = tmp.multiply(tmp0);
}
System.out.println(ans);
}
cin.close();
}
}
题解中给的代码我感觉和我TLE的代码基本等效呀,不明白。。。
题解中1800MS通过的代码:
import java.math.*;
import java.util.*;
public class Main{
public static void main(String args[]){
BigInteger n,ans,tmp,cnt;
int k,t;
Scanner cin=new Scanner(System.in);
t=cin.nextInt();
while(t-->0){
n=cin.nextBigInteger();
k=cin.nextInt();
ans=BigInteger.ZERO;
tmp=BigInteger.valueOf(1<<(k-1));
while(true){
n=n.divide(tmp);
cnt=n.subtract(n.divide(BigInteger.valueOf(2)));
if(cnt.equals(BigInteger.ZERO)) break;
ans=ans.add(cnt);
n=n.divide(BigInteger.valueOf(2));
}
System.out.println(ans);
}
}
}