ZOJ 3987 Numbers(枚举)

来源:互联网 发布:centos7编译安装mysql 编辑:程序博客网 时间:2024/05/17 00:59

没想到是枚举,还推了规律好久,应为对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);     }   }   }  


原创粉丝点击