HDU 4577 X-Boxes (高精度)

题目地址: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--;
		}
	}
}


你可能感兴趣的:(HDU 4577 X-Boxes (高精度))