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--;
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值