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 ...
随机推荐
- php 倒计时程序
<html> <head> <meta http-equiv="Content-Type" content="text/html; ch ...
- web前端学习策略
- Learn python the hard way. python test program 2016.04.27
# this will not be printed in python ! print "I could have code like this." # and the comm ...
- dll--二进制层面的复用
积木式思想其实是很自然的一个过程,从c的库函数到C++的标准库,再到dll.com.com+都是这种思想推动下的结果,和现实生活中的人们的思维方式并无二致,只不过软件是在一个虚拟的世界中,并分化出许多 ...
- Nanopore sensors for nucleic acid analysis 论文阅读笔记
Nanopore sensors for nucleic acid analysis Bala Murali Venkatesan and Rashid Bashir 用于核酸分析的纳米孔传感器 纳米 ...
- 在easyui datagrid中formatter数据后使用linkbutton
http://ntzrj513.blog.163.com/blog/static/2794561220139245411997/ formatter:function(value,rowData,ro ...
- 【转】C#取硬盘、CPU、主板、网卡的序号 ManagementObjectSearcher
private void button1_Click(object sender, EventArgs e) { textBox1.Text = ""; foreach (stri ...
- 非ROOT用户启动Tomcat
[root@Z ~]# adduser tomcat [root@Z ~]# chown -R tomcat:tomcat /usr/local/tomcat/ [root@Z ~]# chown - ...
- ICSharpCode.SharpZipLib.dll,MyZip.dll,Ionic.Zip.dll 使用
MyZip.dll : 有BUG,会把子目录的文件解压到根目录.. ICSharpCode.SharpZipLib.dll: 把ICSharpCode.SharpZipLib.dll复制一份,重命名为 ...
- bzoj2044: 三维导弹拦截
Description 一场战争正在A国与B国之间如火如荼的展开. B国凭借其强大的经济实力开发出了无数的远程攻击导弹,B国的领导人希望,通过这些导弹直接毁灭A国的指挥部,从而取得战斗的胜利!当然,A ...