题意:

给定m,k

0 <= m <= 10^18 ,1 <= k <= 64

求一个数n,满足n+1,n+2,...n+n这n个数中,刚好有m个数的2进制表示法刚好有k个1

保证答案在10^18内

思路:

显然,

对于x,如果x+1,x+2,...,x+x有y个数有k个1

对于x+1,则x+2,x+3,...,x+x+2有k个1的数的个数 >= y

满足单调性,考虑二分:

L = m,r = 10^18

那么问题变为:给定一个数x,x+1,x+2,...,x+x中刚好有k个1的数有多少个

为了方便表达,假设x是2进制数:

则出现k个1的区间有:

[x,11...111],[10...000,2x]

即按照位数分成2段计算

函数go(LL x,int k)作用:求[x,1111111]这个区间中有k个1的数有多少个

则ans = go(x,k) + go(10...000,k) - go((x<<1)&1,k)

判断ans与m的关系就可以不断缩小L,R的范围啦

注意:

求2^x如果用(1 << x)的话,这个时候(1 << x)是默认为int型的,

所以如果超int了,要用(1LL << x)

代码:

  //File Name: cf431D.cpp
//Author: long
//Mail: 736726758@qq.com
//Created Time: 2016年07月09日 星期六 21时34分35秒 #include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream> #define LL long long using namespace std; int a[],tot;
LL f[][]; void init(){
memset(f,,sizeof f);
for(int i=;i<;i++){
f[i][] = ;
for(int j=;j<=i;j++)
f[i][j] = f[i-][j] + f[i-][j-];
}
} LL go(LL x,int k){
tot = ;
while(x){
a[++tot] = x % ;
x >>= ;
}
LL ans = ;
int pre = ;
for(int i=tot;i>;i--){
if(a[i] == )
pre++;
else{
if(k - pre - >= )
ans += f[i-][k-pre-];
else
break;
}
}
if(pre == k)
ans++;
return ans;
} LL get(LL x,int k){
LL ans = go(x,k);
LL y = (1LL << tot);
//printf("x = %lld y = %lld\n",x,y);
ans = ans + go(y,k) - go( * x + ,k);
return ans;
} LL solve(LL m,int k){
LL l = m,r = (LL)1e18 + ,mid;
while(r - l > ){
mid = (l + r) >> ;
LL cur = get(mid,k);
//printf("mid = %lld cur = %lld\n",mid,cur);
if(cur <= m)
l = mid;
else
r = mid;
}
if(get(l,k) == m)
return l;
else
return r;
} int main(){
init();
LL m;
int k;
cin >> m >> k;
cout << solve(m,k) << endl;
return ;
}

codeforces 431 D. Random Task 组合数学的更多相关文章

  1. Codeforces Round #247 (Div. 2) D. Random Task

    D. Random Task time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  2. 计数排序 + 线段树优化 --- Codeforces 558E : A Simple Task

    E. A Simple Task Problem's Link: http://codeforces.com/problemset/problem/558/E Mean: 给定一个字符串,有q次操作, ...

  3. codeforces 70D Professor's task(动态二维凸包)

    题目链接:http://codeforces.com/contest/70/problem/D Once a walrus professor Plato asked his programming ...

  4. Codeforces 558E A Simple Task (计数排序&&线段树优化)

    题目链接:http://codeforces.com/contest/558/problem/E E. A Simple Task time limit per test5 seconds memor ...

  5. codeforces 932E Team Work(组合数学、dp)

    codeforces 932E Team Work 题意 给定 \(n(1e9)\).\(k(5000)\).求 \(\Sigma_{x=1}^{n}C_n^xx^k\). 题解 解法一 官方题解 的 ...

  6. 【CODEFORCES】 B. Random Teams

    B. Random Teams time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  7. CF431D Random Task 二分+数位dp

    One day, after a difficult lecture a diligent student Sasha saw a graffitied desk in the classroom. ...

  8. Codeforces C. A Simple Task(状态压缩dp)

    题目描述:  A Simple Task time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  9. Codeforces 840C 题解(DP+组合数学)

    题面 传送门:http://codeforces.com/problemset/problem/840/C C. On the Bench time limit per test2 seconds m ...

随机推荐

  1. Codeforces Round #150 (Div. 2)

    A. Dividing Orange 模拟. B. Undoubtedly Lucky Numbers 暴力枚举\(x.y\). C. The Brand New Function 固定左端点,右端点 ...

  2. Codeforces Round #373 (Div. 1)

    Codeforces Round #373 (Div. 1) A. Efim and Strange Grade 题意 给一个长为\(n(n \le 2 \times 10^5)\)的小数,每次可以选 ...

  3. 归并排序 空间复杂度为O(1)的做法

    #include <iostream> #include <cstdlib> using namespace std; void print(int *arr, int sta ...

  4. 越狱Season 1-Episode 21: Go

    Season 1, Episode 21: Go -Michael: I need you to let me get us out of here. 我需要你帮我出去 -Patoshik: If y ...

  5. 论文笔记之:Playing for Data: Ground Truth from Computer Games

    Playing for Data: Ground Truth from Computer Games ECCV 2016 Project Page:http://download.visinf.tu- ...

  6. Lua5.1基本函数库介绍

    Lua5.1基本函数库介绍assert (v [, message])功能:相当于C的断言,参数:v:当表达式v为nil或false将触发错误,message:发生错误时返回的信息,默认为" ...

  7. Java Warmup

    http://www.brendangregg.com/blog/2016-09-28/java-warmup.html

  8. 5分钟实现Android中更换头像功能

    写在前面:更换头像这个功能在用户界面几乎是100%出现的.通过拍摄照片或者调用图库中的图片,并且进行剪裁,来进行头像的设置.功能相关截图如下: 下面我们直接看看完整代码吧: 1 2 3 4 5 6 7 ...

  9. add to svn ignore disabled

    The problem is that the folder is already under version control. Here's how I fix this type of probl ...

  10. windows知识点

    https://technet.microsoft.com/zh-cn/windows/dd641430  win7相关资源 23. Remtoe FX是微软WIN2008 R2的SP1新功能首先您需 ...