想用c++来写大数,看来还是不太现实,借鉴了java版的
import java.io.*; import java.math.*; import java.util.*; /* * (2x-1)*2^(ky-1) <= n * (2x-1)*2^(ky) <= n*2 */ public class Main { public static void main(String args[]) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); int t, k; BigInteger n, y, c; t = cin.nextInt(); while (t-->0) { BigInteger res = BigInteger.ZERO; n = cin.nextBigInteger(); k = cin.nextInt(); n = n.multiply(BigInteger.valueOf(2)); y = BigInteger.valueOf(1<<k); while (n.compareTo(BigInteger.ZERO) > 0) { n = n.divide(y); c = n.add(BigInteger.ONE).divide(BigInteger.valueOf(2)); res = res.add(c); } System.out.println(res); } } }