记录编号 74312 评测结果 AAAAAAAAAAAAA
题目名称 二进制数01串 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.028 s
提交时间 2013-10-24 21:08:09 内存使用 0.28 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. ll C[51][51]={0};
  7. void getC(void){
  8. C[0][0]=1;
  9. ll i,j;
  10. for(i=1;i<=50;i++){
  11. C[i][0]=1;
  12. for(j=1;j<=i;j++){
  13. C[i][j]=C[i-1][j-1]+C[i-1][j];
  14. }
  15. }
  16. }
  17. ll N,L,I;
  18. //第i位就是右起第i位,从1开始计数
  19. ll getbit(ll x,ll k){//得到x的二进制第k位
  20. return (x&(1<<(k-1)))!=0;
  21. }
  22. void outbit(ll x){//以二进制形式输出x
  23. ll i;
  24. for(i=N;i>=1;i--){
  25. printf("%lld",getbit(x,i));
  26. }
  27. }
  28. ll stat(ll x){//小于x且符合题意的数的个数
  29. ll sum=0;//前面有的1的个数,先算上最高位的1
  30. ll i,j;
  31. ll ans=0;
  32. for(i=N;i>=1&&sum-1<L;i--){
  33. if(getbit(x,i)==0) continue;
  34. else{//计算从这一位开始有差异的数的个数
  35. sum++;
  36. //第i位必须是0,已经放了sum-1个1
  37. //至多再放L-sum+1个1
  38. //接下来的i-1位可以任意放置不超过L-sum+1个1
  39. for(j=0;j<=L-sum+1;j++){
  40. ans+=C[i-1][j];
  41. }
  42. }
  43. }
  44. return ans;
  45. }
  46. ll find(ll left,ll right){//在[left,right]区间内找答案
  47. //若答案为ans,则stat(ans)=I-1且stat(ans+1)=I+1
  48. //stat值递增
  49. if(left==right) return left;
  50. ll mid=(left+right)&1?left+right+1:left+right;mid>>=1;
  51. if(stat(mid)<=I-1){
  52. return find(mid,right);
  53. }
  54. else{//就在[left,mid]中
  55. return find(left,mid-1);
  56. }
  57. }
  58. int main(){
  59. freopen("kimbits.in","r",stdin);
  60. freopen("kimbits.out","w",stdout);
  61. scanf("%lld%lld%lld",&N,&L,&I);
  62. getC();
  63. ll low,high;
  64. low=0;high=(1<<N)-1;
  65. outbit(find(low,high));printf("\n");
  66. return 0;
  67. }