Codeforces 912E Prime Gift(预处理 + 双指针 + 二分答案)
题目链接 Prime Gift
题意 给定一个素数集合,求第k小的数,满足这个数的所有质因子集合为给定的集合的子集。
保证答案不超过$10^{18}$
考虑二分答案。
根据折半的思想,首先我们把这个集合的数分成两组。
然后分别生成这两组质数所能表示出的正整数的集合。
然后把这个集合sort一下,我们得到了两个有序的数列。
在计算小于等于某个数$x$的符合题目条件的数的时候,我们枚举第一个集合中的数,
用双指针定位和当前枚举到的数乘积恰好小于等于$x$的位置。
然后累加。
这里有一个细节,我们要保证两个正整数的集合的大小要尽可能接近。
所以分组方式要稍微讲究一下,
我这里先对整个数列sort,再根据位置的奇偶性把整个数列分成两组。
这道题的极限数据的集合应该是前$16$小的质数……
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const int N = 63; int n;
int cnt;
LL a[N], c[N], k, l, r;
vector <LL> s[2]; void dfs(int i, int x, LL now){
s[i].push_back(now);
rep(j, x, cnt) if (1e18 / c[j] >= now) dfs(i, j, now * c[j]);
} LL solve(LL x){
int j = 0;
LL ret = 0;
dec(i, s[0].size() - 1, 0){
while (j < s[1].size() && s[1][j] <= x / s[0][i]) ++j;
ret += j;
}
return ret;
} int main(){ scanf("%d", &n);
rep(i, 1, n) scanf("%lld", a + i);
sort(a + 1, a + n + 1);
scanf("%lld", &k); cnt = 0;
rep(i, 1, n) if (i & 1) c[++cnt] = a[i];
dfs(0, 1, 1); cnt = 0;
rep(i, 1, n) if (!(i & 1)) c[++cnt] = a[i];
dfs(1, 1, 1); sort(s[0].begin(), s[0].end());
sort(s[1].begin(), s[1].end()); l = 1, r = 1e18;
while (l + 1 < r){
LL mid = (l + r) / 2;
if (solve(mid) >= k) r = mid;
else l = mid + 1;
} if (solve(l) >= k) printf("%lld\n", l);
else printf("%lld\n", r);
return 0;
}
Codeforces 912E Prime Gift(预处理 + 双指针 + 二分答案)的更多相关文章
- CF912E Prime Gift题解(搜索+二分答案)
CF912E Prime Gift题解(搜索+二分答案) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1314956 洛谷题目链接 $ $ CF题目 ...
- Codeforces 912E - Prime Gift
912E - Prime Gift 思路: 折半枚举+二分check 将素数分成两个集合(最好按奇偶位置来,保证两集合个数相近),这样每个集合枚举出来的小于1e18的积个数小于1e6. 然后二分答案, ...
- Codeforces 912E Prime Gift ( 二分 && 折半枚举 && 双指针技巧)
题意 : 给你 N ( 1 ≤ N ≤ 16 ) 个质数,然后问你由这些质数作为因子的数 ( 此数不超 10^18 ) & ( 不一定需要其因子包含所给的所有质数 ) 的第 k 个是什么 分析 ...
- Codeforces H. Prime Gift(折半枚举二分)
题目描述: Prime Gift time limit per test 3.5 seconds memory limit per test 256 megabytes input standard ...
- codeforces912E(折半搜索+双指针+二分答案)
E. Prime Gift E. Prime Gift time limit per test 3.5 seconds memory limit per test 256 megabytes inpu ...
- CodeForces 1117C Magic Ship (循环节+二分答案)
<题目链接> 题目大意: 给定起点和终点,某艘船想从起点走到终点,但是海面上会周期性的刮风,船在任何时候都能够向四个方向走,或者选择不走,船的真正行走路线是船的行走和风的走向叠加的,求船从 ...
- Codeforces Round #262 (Div. 2)C(二分答案,延迟标记)
这是最大化最小值的一类问题,这类问题通常用二分法枚举答案就行了. 二分答案时,先确定答案肯定在哪个区间内.然后二分判断,关键在于怎么判断每次枚举的这个答案行不行. 我是用a[i]数组表示初始时花的高度 ...
- Codeforces Round #389 (Div. 2) 752E(二分答案)
题目大意 可以理解成有n个木板,可以选取木板将其劈成2半(如果长度是奇数,就切成x和x+1),切完之后还可以再切 然后你要把这n个木板切成更多的木板,然后从中选择k个,使得这k个木板的最小长度尽量大 ...
- Codeforces Round #384 (Div. 2) 734E(二分答案+状态压缩DP)
题目大意 给定一个序列an,序列中只有1~8的8个整数,让你选出一个子序列,满足下列两个要求 1.不同整数出现的次数相差小于等于1 2.子序列中整数分布是连续的,即子序列的整数必须是1,1,1.... ...
随机推荐
- The 2016 ACM-ICPC Asia Shenyang Regional Contest
A. Thickest Burger 大数 × 2 + 小数 #include <cstdio> #include <algorithm> using namespace st ...
- Python 信号处理 signal 模块
Table of Contents 1. signal模块简介 1.1. signal简单示例 1.2. signal说明 1.2.1. 基本的信号名 1.2.2. 常用信号处理函数 2. signa ...
- Go语言之并发编程(四)
同步 Go 程序可以使用通道进行多个 goroutine 间的数据交换,但这仅仅是数据同步中的一种方法.通道内部的实现依然使用了各种锁,因此优雅代码的代价是性能.在某些轻量级的场合,原子访问(atom ...
- 用js立即执行函数开发基于bootstrap-multiselect的联动参数菜单
代码调用方式如下: data=[{F0:总分类cd,F1:总分类name,F2:大分类cd,F3:大分类name,F4:中分类cd,F5:中分类name,F6:小分类cd,F7:小分类name},.. ...
- Dcgpofix
TechNet Library Windows Server Windows Server 2012 R2 and Windows Server 2012 Management and Tools C ...
- 第一次接触php
一.什么是PHP PHP的中文意思:超文本预处理器,英文名字: HyperText Preprocessor. PHP通常有两层含义: (1)PHP是一个编程语言. (2)PHP是处理PHP编程语言的 ...
- 使用 Pinup,PinupManager 在 XNA 中创建贴图(十七)
平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...
- Python-S9—Day86-ORM项目实战之会议室预定相关
01 会议室预定1 02 会议室预定2 03 会议室预定3 04 会议室预定4 05 会议室预定5 06 会议室预定6 01 会议室预定1 1.1 项目的架构目录: 1.2 使用Pycharm创建Dj ...
- quagga源码学习--BGP协议的初始化
quagga支持BGP-4,BGP-4+协议,支持多协议(mpls,isis,ospf等等)以及单播,组播路由的导入和分发. 具体的协议,这里就不附录了,网络上有很多资料,或者RFC. 协议源码的学习 ...
- Arcengine 基本操作(待更新)
/// <summary> /// 删除fieldName属性值为1的弧段 /// </summary> /// <param name="fieldName& ...