codeforces 431 D. Random Task 组合数学
题意:
给定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 组合数学的更多相关文章
- 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 ...
- 计数排序 + 线段树优化 --- Codeforces 558E : A Simple Task
E. A Simple Task Problem's Link: http://codeforces.com/problemset/problem/558/E Mean: 给定一个字符串,有q次操作, ...
- codeforces 70D Professor's task(动态二维凸包)
题目链接:http://codeforces.com/contest/70/problem/D Once a walrus professor Plato asked his programming ...
- Codeforces 558E A Simple Task (计数排序&&线段树优化)
题目链接:http://codeforces.com/contest/558/problem/E E. A Simple Task time limit per test5 seconds memor ...
- codeforces 932E Team Work(组合数学、dp)
codeforces 932E Team Work 题意 给定 \(n(1e9)\).\(k(5000)\).求 \(\Sigma_{x=1}^{n}C_n^xx^k\). 题解 解法一 官方题解 的 ...
- 【CODEFORCES】 B. Random Teams
B. Random Teams time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- CF431D Random Task 二分+数位dp
One day, after a difficult lecture a diligent student Sasha saw a graffitied desk in the classroom. ...
- Codeforces C. A Simple Task(状态压缩dp)
题目描述: A Simple Task time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- Codeforces 840C 题解(DP+组合数学)
题面 传送门:http://codeforces.com/problemset/problem/840/C C. On the Bench time limit per test2 seconds m ...
随机推荐
- CDH hive的安装
tar zxvf 解压包 配置环境变量 export HIVE_HOME=/usr/local/soft/hiveexport PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HO ...
- timus 1033 Labyrinth(BFS)
Labyrinth Time limit: 1.0 secondMemory limit: 64 MB Administration of the labyrinth has decided to s ...
- java的nio之:java的nio系列教程之channel的数据交换
在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel. transferFro ...
- http cookies
https://msdn.microsoft.com/en-us/library/ms178194.aspx?f=255&MSPPError=-2147217396 http://www.as ...
- 20 款超棒免费的 Bootstrap 管理和前端模板
http://www.oschina.net/news/62506/20-best-free-bootstrap-admin-and-frontend-templates-2015
- 一个LINUX狂人的语录(个人认为很精辟)
http://blog.chinaunix.net/uid-57160-id-2734431.html?page=2 我已经半年没有使用 Windows 的方式工作了.Linux 高效的完成了我所有的 ...
- WebAPI Post类型传参报错“找不到与该请求匹配的操作”
错误内容: Message=未找到与请求 URI“http://localhost:42914/api/Products/Login”匹配的 HTTP 资源. MessageDetail=在控制器“P ...
- Android中使用speex将PCM录音格式转Wav格式
Android中使用speex将PCM录音格式转Wav格式 2013-09-17 17:24:00| 分类: android | 标签:android speex wav |举报|字号 订阅 ...
- 合并master分支到自己的分支
切换到自己的分支(比如:self):git checkout self: 在自己分支下,推送自己的分支到github远端仓库:git push --set-upstream origin self: ...
- window7 下 安装 apache24(httpd-2.4.10-x86-r2)加 php5.6(php-5.6.4-Win32-VC11-x86)加yaf(php_yaf-2.3.3-5.6-ts-vc11-x86)整合
window7 下 安装 apache24(httpd-2.4.10-x86-r2)加 php5.6(php-5.6.4-Win32-VC11-x86)加yaf(php_yaf-2.3.3-5.6-t ...