题目描述
FJ给他的奶牛用二进制进行编号,每个编号恰好包含K 个"1" (1 <= K <= 10),且必须是1开头。FJ按升序编号,第一个编号是由K个"1"组成。
请问第N(1 <= N <= 10^7)个编号是什么。
输入格式
- Line 1: Two space-separated integers, N and K.
输出格式
无
输入输出样例
输入 #1 复制
7 3
输出 #1 复制
10110
解释:k=1特殊处理,其他的话枚举长度,然后计算组合数不断缩小范围,同时也能确定其位的值,和康托展开思想类似
#include<iostream>
#include<cstdio>
using namespace std;
long long C[100005][12]={0};
int main(){
ios::sync_with_stdio(false);
for(int i=0;i<=100005;i++){
C[i][0]=1;
for(int j=1;j<=min(i,12);j++) C[i][j]=C[i-1][j]+C[i-1][j-1];
}
long long n,k;
scanf("%lld%lld",&n,&k);
k--;
putchar('1');
if(!k){
for(int i=1;i<n;i++) putchar('0');
return 0;
}
int len=k;
while(n>1){
if(n-C[len][k]>0){
n-=C[len][k];len++;
}else{
for(int i=1;i<=len;i++){
int sum=0;
if(n-C[len-i][k]>0){
n-=C[len-i][k];k--;
sum=1;
}
if(sum) putchar('1');
else putchar('0');
}
}
}
return 0;
}