ZOJ 3987 Numbers(枚举)

没想到是枚举,还推了规律好久,应为对Java的不了解,所以没想到枚举,或者感觉枚举太麻烦会超时,首先最多枚举2的4000次方,4000重循环不会超时,每次2的k次方的计算也不会超时,因为pow复杂度是lg。所以,应该直接暴力,开始思路被带偏,或者说对Java的不了解,没做出来,所以直接枚举能放下的最小的就行了,如果2^k-1能放下,就不放2^k,对2^(k-1)进行判断,学了一波java大数,顺便当模板耍吧。



--------------------------------------因为热爱,所以坚持--------------------------------------------

import java.math.*;
import java.util.*;
  
public class Main   
{  
	 public static void main(String[] args)
   {
	   Scanner cin=new Scanner(System.in);
	   int t=cin.nextInt(),kkk;
	   for(int i=1;i<=t;i++)
	   {
		  BigInteger n,m,sum,ans,ttt;
		  n=cin.nextBigInteger();
		  m=cin.nextBigInteger();
		  ans=BigInteger.valueOf(0);
		  sum=BigInteger.valueOf(0);
		  int cnt=0;
		  while(sum.compareTo(n)<0)
		  {
			  ttt=BigInteger.valueOf(2).pow(cnt).multiply(m);
			 sum= sum.add(ttt);
			  cnt++;
		  }
		 
		  for(int j=cnt;j>=0;j--)
		  {
			 BigInteger tmp= BigInteger.valueOf(2).pow(j).subtract(BigInteger.ONE);
			 tmp=tmp.multiply(m);
		  if(tmp.compareTo(n)>=0)continue;
		  tmp=BigInteger.valueOf(2).pow(j);
		  ans=ans.add(tmp);
		  //System.out.println(ans+" "+tmp);
		  BigInteger kk=n.divide(tmp);
		  kk=kk.min(m);
		  tmp= tmp.multiply(kk);
		  n=n.subtract(tmp);
		  }
		  System.out.println(ans);
		  
	   }
   }
   
}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值