您的位置:首页 > 其它

微软2014实习生及秋令营技术类职位在线测试: K-th string

2014-04-13 10:32 302 查看
import java.util.Scanner;

public class KString_2 {

private static int number = 33 ;
private static int[] comb = new int[(number+1)*(number+2)/2];  // 预处理好的排列组合值
public static void main(String[] args) {

computerComb();  //预处理获取排列组合值

Scanner in = new Scanner(System.in);

int caseNumber = in.nextInt();
int num0 , num1 , kth ;
while(in.hasNext()){
num0 = in.nextInt();
num1 = in.nextInt();
kth = in.nextInt() ;

int result[] = new int[100] ;
int length = 0 ;

if(getComb(num0,num1) < kth){
System.out.println("Impossible");
continue;
}
while(kth > 0){
if(kth == 1){
while(num0 > 0){result[length++] = 0;num0--;}
while(num1 > 0){result[length++] = 1;num1--;}
break;
}
if(getComb(num0-1, num1) >= kth){
result[length++] = 0;
num0--;
}
else {
result[length++] = 1;
kth-=getComb(num0-1, num1);
num1--;
}
}

for(int i = 0 ; i < length ; i++)
System.out.print(result[i]);
System.out.println();
}
}

private static int getComb(int num0, int num1) {
if(num0 ==0 | num1==0) return 1;
if(num0==1) return num1+1;
if(num1==1)return num0+1;

int  k = num0 > num1 ? num1:num0;

int  n = num0 + num1 ;
return comb[(n*(n+1)/2+k)];
}

private static void computerComb(){

for(int n = 2 ; n <= 33 ;n++){
for(int k = 1 ; k<= n; k++)
comb[n*(n+1)/2+k] = comb(n,k);
}
}

private static int comb(int n, int k) {
k = (n-k) > k ?k:n-k;

int result = 1 ;

for(int i = 1 ; i<= k;i++,n--)
result*=n;
int div = 1 ;
for(int i = 1 ;i<=k;i++)
div*=i;
return result/div;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐