记录编号 |
74312 |
评测结果 |
AAAAAAAAAAAAA |
题目名称 |
二进制数01串 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.028 s |
提交时间 |
2013-10-24 21:08:09 |
内存使用 |
0.28 MiB |
显示代码纯文本
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- typedef long long ll;
- ll C[51][51]={0};
- void getC(void){
- C[0][0]=1;
- ll i,j;
- for(i=1;i<=50;i++){
- C[i][0]=1;
- for(j=1;j<=i;j++){
- C[i][j]=C[i-1][j-1]+C[i-1][j];
- }
- }
- }
- ll N,L,I;
- //第i位就是右起第i位,从1开始计数
- ll getbit(ll x,ll k){//得到x的二进制第k位
- return (x&(1<<(k-1)))!=0;
- }
- void outbit(ll x){//以二进制形式输出x
- ll i;
- for(i=N;i>=1;i--){
- printf("%lld",getbit(x,i));
- }
- }
- ll stat(ll x){//小于x且符合题意的数的个数
- ll sum=0;//前面有的1的个数,先算上最高位的1
- ll i,j;
- ll ans=0;
- for(i=N;i>=1&&sum-1<L;i--){
- if(getbit(x,i)==0) continue;
- else{//计算从这一位开始有差异的数的个数
- sum++;
- //第i位必须是0,已经放了sum-1个1
- //至多再放L-sum+1个1
- //接下来的i-1位可以任意放置不超过L-sum+1个1
- for(j=0;j<=L-sum+1;j++){
- ans+=C[i-1][j];
- }
- }
- }
- return ans;
- }
- ll find(ll left,ll right){//在[left,right]区间内找答案
- //若答案为ans,则stat(ans)=I-1且stat(ans+1)=I+1
- //stat值递增
- if(left==right) return left;
- ll mid=(left+right)&1?left+right+1:left+right;mid>>=1;
- if(stat(mid)<=I-1){
- return find(mid,right);
- }
- else{//就在[left,mid]中
- return find(left,mid-1);
- }
- }
- int main(){
- freopen("kimbits.in","r",stdin);
- freopen("kimbits.out","w",stdout);
- scanf("%lld%lld%lld",&N,&L,&I);
- getC();
- ll low,high;
- low=0;high=(1<<N)-1;
- outbit(find(low,high));printf("\n");
- return 0;
- }