CSP模拟赛 number (二分+数位DP)
题面
给定整数m,km,km,k,求出最小和最大的正整数 nnn 使得 n+1,n+2,…,2nn+1,n+2,…,2nn+1,n+2,…,2n 中恰好有 mmm 个数 在二进制下恰好有 kkk 个 111。如果有无数个满足条件则输出一行一个整数−1-1−1。有TTT组数据。
T≤2000T\le 2000T≤2000
m≤1e18m\le 1e18m≤1e18
k≤64k\le 64k≤64
保证1e181e181e18内 存在一个数满足条件。
题解
设f(i)f(i)f(i)表示i+1,i+2,...,2ii+1,i+2,...,2ii+1,i+2,...,2i中在二进制下为恰好有kkk个111的数的个数。可以证明打表发现f(i)f(i)f(i)是单调不降的。所以就可以二分了。二分后数位DPDPDP就行了。计算f(i)f(i)f(i)可以用g(2i)−g(i)g(2i)-g(i)g(2i)−g(i),其中g(i)g(i)g(i)表示111到iii的数中在二进制下恰好有kkk个111的数的个数。
因为数位DPDPDP的数组是可以多次用的,所以时间复杂度是整体两个logloglog的,而每次时间复杂度为O(+Tlog2(二分上界))O(+T\log^2(二分上界))O(+Tlog2(二分上界))
但是这里的二分上界并不是1e181e181e18,因为保证最小的nnn在1e181e181e18内,但是最大的可能超出。所以上界我设的2632^{63}263
输出−1-1−1的情况只有一种就是k=1k=1k=1,在n=2pn=2^pn=2p时满足。
CODE
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
ULL m, f[70][70];
int k, c[70], n;
bool vis[70][70];
ULL dfs(int i, int j, bool fp) {
if(!fp && vis[i][j]) return f[i][j];
if(i == 0) return j == 0;
ULL ans = 0; int mx = fp ? c[i] : 1;
for(int d = 0; d <= mx; ++d) ans += dfs(i-1, j-d, fp&&d==mx);
if(!fp) vis[i][j] = 1, f[i][j] = ans;
return ans;
}
ULL cal(ULL x) {
for(n=0; x; c[++n]=x&1,x>>=1);
return dfs(n, k, 1);
}
ULL chk(ULL x) { return cal(2*x) - cal(x); }
int main() {
int T; scanf("%d", &T); while(T--) {
scanf("%llu%d", &m, &k);
if(k == 1) puts("-1");
else {
ULL l = 1, r = 1llu<<63, mid;
while(l < r) {
mid = (l + r) >> 1;
if(chk(mid) >= m) r = mid;
else l = mid+1;
}
ULL L = 1, R = 1llu<<63, MID;
while(L < R) {
MID = (L + R) >> 1;
if(chk(MID) > m) R = MID;
else L = MID+1;
}
printf("%llu %llu\n", l, L-1);
}
}
}
CSP模拟赛 number (二分+数位DP)的更多相关文章
- 2019.6.1 模拟赛——[ 费用流 ][ 数位DP ][ 计算几何 ]
第一题:http://codeforces.com/contest/1061/problem/E 把点集分成不相交的,然后跑费用流即可.然而错了一个点. #include<cstdio> ...
- CSP模拟赛 Repulsed(树形DP)
题面 ⼩ w ⼼⾥的⽕焰就要被熄灭了. 简便起⻅,假设⼩ w 的内⼼是⼀棵 n − 1 条边,n 个节点的树. 现在你要在每个节点⾥放⼀些个灭⽕器,每个节点可以放任意多个. 接下来每个节点都要被分配给 ...
- Codeforces Round #460 (Div. 2) B Perfect Number(二分+数位dp)
题目传送门 B. Perfect Number time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- POJ3208 Apocalypse Someday(二分 数位DP)
数位DP加二分 //数位dp,dfs记忆化搜索 #include<iostream> #include<cstdio> #include<cstring> usin ...
- shuoj 1 + 2 = 3? (二分+数位dp)
题目传送门 1 + 2 = 3? 发布时间: 2018年4月15日 22:46 最后更新: 2018年4月15日 23:25 时间限制: 1000ms 内存限制: 128M 描述 埃森哲是 ...
- [10.12模拟赛] 老大 (二分/树的直径/树形dp)
[10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...
- CF431D Random Task 二分+数位dp
One day, after a difficult lecture a diligent student Sasha saw a graffitied desk in the classroom. ...
- HDU3709 Balanced Number (数位dp)
Balanced Number Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Descript ...
- HDU 5787 K-wolf Number (数位DP)
K-wolf Number 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5787 Description Alice thinks an integ ...
随机推荐
- 024 Android 自定义样式对话框(AlertDialog)
1.AlertDialog介绍 AlertDialog并不需要到布局文件中创建,而是在代码中通过构造器(AlertDialog.Builder)来构造标题.图标和按钮等内容的. 常规使用步骤(具体参见 ...
- 【springcloud】2.eureka源码分析之令牌桶-限流算法
国际惯例原理图 代码实现 package Thread; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomi ...
- Shiro授权及注解式开发
目的: shiro授权 shiro注解式开发 Shiro授权 首先设计shiro权限表: 从图中我们也清晰的看出五张表之间的关系 ShiroUserMapper Set<String> g ...
- oracle update left join 写法
oracle update left join 写法 (修改某列,条件字段在关联表中) 案例: E:考核表 X,:用户表 USERNAME 关联 需求:修改营业部最高分 分析:通过登录账号的营业部OR ...
- IDEA/WebStorm使用笔记
1.使用powershell作为默认终端 #改变powershell策略 Set-ExecutionPolicy Unrestricted -Scope CurrentUser 找到系统的powers ...
- dB分贝计算
1. 定义 dB-表征相对值的大小的单位,即两个电.声功率之比或者电流.电压.音量之比,是一种测相对大小的单位. 1.1 电.声功率之比——10lg(x/y) x.y分别表示两个欲比较的功率值. 例如 ...
- 0.b概述
一.计算机与算法 计算 = 信息处理 计算模型 = 计算机 = 信息处理工具 算法:特定计算模型下,解决特定问题的指令序列 要素:输入 输出 正确性 确定性 可行性 有穷性 好算法:正确 健壮 可读 ...
- Java 之 递归
一.概述 递归:指在当前方法内调用自己的现象. 递归的分类: 递归分为两种,直接递归和简介递归 直接递归称为方法自身调用自己 间接递归可以 A 方法调用 B 方法,B 方法调用 C 方法,C 方法调用 ...
- iOS NSNotification传递带参数的通知
普通的通知使用 注册观察者 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getNotificat ...
- SAP Marketing Cloud功能简述(三) 营销活动内容设计和产品推荐
Grace的前两篇文章: SAP Marketing Cloud功能简述(一) : Contacts和Profiles SAP Marketing Cloud功能简述(二) : Target Grou ...