nefu-1035 数位统计

 

Time Limit : 1000ms

Memory Limit : 65536K

description

上次哈工程校赛有一个比较有趣的问题,我们一起来探讨一下!
给一个整数10,把10用二进制表示为 1010,那么10的二进制表示中有2个1
那么现在的问题是这样的:给一个整数n,然后问小于n的所有数中有多少个数它们的二进制表示中有k个1。
  

input

 多组输入,每组两个整数n,k(n<1000000000,k<20)
  

output

  输出结果

sample_input

10 2
5 1

sample_output

4
3

hint

#include <iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<cstdio>
using namespace std;

int zu(int n,int k)
{
    double ans=1;

    if(n-k<k) k=n-k;
    for(int i=1;i<=k;i++)
    ans=ans*(n+1-i)/i;

    ans+=0.5;

    return (int)ans;

}
int main()
{

  int n,w,t,k,ans;

while(cin>>n>>k)
{

ans=0;
while(n)
 {
   w=0; t=n;
   while(t) { w++; t=t>>1; }

   if(w>k) ans+=zu(w-1,k);

 n=n-(1<<(w-1));
 k--;
 if(k<0) break;
 }


  cout<<ans<<endl;
}

    return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值