题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4577
题意:给你n个球,k个盒子,放球满足以下规则:
1、第i个盒子放编号为x的球,那么第i+1个盒子一定放编号为2x的求。
问你第一个盒子最多能放多少个球。
题解:从1开始放在第一个盒子里面,然后照上面规则放完k个盒子,然后再放剩下球编号最小的在第一个盒子……,直到不能放完k个盒子。
第一位最多可放置(n/(2^(k-1)+1)/2个(第奇数个肯定全都能放到),然后再看多余部分,可以放置1,3,5,7乘以他们的2^(jk)(j=1,2,3,4,...),这个跑一个循环就出来了两部分加和,即为答案。
AC代码:
import java.math.BigInteger;
import java.util.Scanner;
public class Main
{
static Scanner cin=new Scanner(System.in);
public static void main(String[] args)
{
int T,k;
BigInteger sum,x,n,p,two=BigInteger.valueOf(2),zero=BigInteger.ZERO;
T=cin.nextInt();
while(T!=0)
{
n=cin.nextBigInteger();
k=cin.nextInt();
sum=zero;
x=BigInteger.valueOf(1<<(k-1));
while(true)
{
n=n.divide(x);
p=n.subtract(n.divide(two));
if(p.equals(zero)) break;
sum=sum.add(p);
n=n.divide(two);
}
System.out.println(sum);
T--;
}
}
}