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