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 ...
随机推荐
- Ci分开配置网站前台后台的方法
CodeIgniter 是一个简单快速的PHP MVC框架.EllisLab 的工作人员发布了 CodeIgniter.许多企业尝试体验过所有 PHP MVC 框架之后,CodeIgniter 都成为 ...
- POJ1087 A Plug for UNIX(网络流)
A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K Total S ...
- Spring源码学习之:spring注解@Transactional
在分析深入分析@Transactional的使用之前,我们先回顾一下事务的一些基本内容. 事务的基本概念 先来回顾一下事务的基本概念和特性.数据库事务(Database Transaction) ,是 ...
- DuiLib——第一篇UIManager
DUiLib 源码分析 --以UiLib 1.01版为分析目标 -------------------------------------------------------------------- ...
- Python3字典中items()和python2.x中iteritems()有什么区别
在Python2.x中,items( )用于 返回一个字典的拷贝列表[Returns a copy of the list of all items (key/value pairs) in D],占 ...
- 基于theano的深度卷积神经网络
使用了两个卷积层.一个全连接层和一个softmax分类器. 在测试数据集上正确率可以达到99.22%. 代码参考了neural-networks-and-deep-learning #coding:u ...
- vi 常用命令行
vi 常用命令行 1.vi 模式 a) 一般模式: vi 处理文件时,一进入该文件,就是一般模式了. b) 编辑模式:在一般模式下可以进行删除,复制,粘贴等操作,却无法进行编辑操作.等按下‘i,I ...
- IPy
IPy生成网段列表from IPy import IPip = IP('192.168.0.0/16')print ip.len()for x in ip:print (x) ip的属性,'PUBLI ...
- 关于web.config中customErrors
<customErrors>节点用于定义一些自定义错误信息的信息.此节点有Mode和defaultRedirect两个属性,其中defaultRedirect属性是一个可选属性,表示应用程 ...
- unity, 由unity5.2.1升级到5.4.2物体变亮解法
由unity5.2.1升级到5.4.2之后,使用standard shader的物体会变亮. 原因如图: 框中两项是5.4.2多出来的,如果把specular Highlights的勾选去掉,就跟以前 ...