这道题是数学题,数学渣表示只能打表找规律,以下为打的表:
1 2 4
3 6 12
5 10 20
7 14 28
8 16 32
9 18 36
11 22 44
13 26 52
15 30 60
17 34 68
19 38 76
21 42 84
23 46 92
24 48 96
25 50 100
27 54 108
29 58 116
31 62 124
33 66 132
35 70 140
37 74 148
39 78 156
40 80 160
41 82 164
43 86 172
45 90 180
47 94 188
49 98 196
......
我打了第一位最大100,k==3的表,很容易发现奇数全部出现,但是乱入的偶数是什么鬼(上面已用红字标明)。好吧,那我就把这些偶数全都提出来如下,最左边为提出来的偶数,除以8后得到一组神奇的数,这组数不就是原数列的第一位。可想而知这些偶数的集合除以一个常数后就变成了原问题,只不过规模变小了(因为除以一个常数),那么这个常数是什么呢,就是2^(k),哈哈是不是很神奇。
出现在其中的偶数 /8== ?
8 /8== 1
24 /8== 3
40 /8== 5
56 /8== 7
64 /8== 8
72 /8== 9
88 /8== 11
import java.util.*;
import java.io.BufferedInputStream;
import java.lang.*;
import java.math.*;
class Task{
void solve(){
Scanner in=new Scanner(new BufferedInputStream(System.in));
int t;
t=in.nextInt();
while(t-->0){
int k=3;
int [] a=new int[1000];
Arrays.fill(a, 0);
ArrayList<Integer> res=new ArrayList();
for(int i=1;i<100;i++){
if( a[i]==0 ){
if( (i&1)==0 )res.add(i);
for(int j=0;j<k;j++){
System.out.print( i*(1<<j) +" ");
a[ i*(1<<j) ]=1;
}
System.out.println();
}
}
System.out.println("出现在其中的偶数 /8== ?");
for( Integer i:res ){
System.out.println(i+" /8== "+i/8);
}
}
in.close();
}
}
public class Main {
public static void solve(){
Scanner in=new Scanner(new BufferedInputStream(System.in));
int t=in.nextInt();
while(t-->0){
BigInteger n=in.nextBigInteger();
int k=in.nextInt();
BigInteger tmp=BigInteger.valueOf(1<<(k-1));
BigInteger ans=BigInteger.ZERO;
while( n.compareTo(BigInteger.ZERO)==1 ){
ans=ans.add(n.divide(tmp).add(BigInteger.ONE).divide(BigInteger.valueOf(2)));
n=n.divide(tmp.multiply(BigInteger.valueOf(2)));
}
System.out.println(ans);
}
}
public static void main(String[] args) {
solve();
}
}