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.... ...
随机推荐
- BFS:HDU2612-Find a way(双向BFS)
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 将SpringBoot默认Json解析框架jackson替换成fastjson
步骤一:引入依赖<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson< ...
- kettle - Linux下定时执行kettle作业
Linux下实现kettle 自动同步数据 1.安装jdk tar -zxvf jdk-7u25-linux-x64.tar.gz -C /usr/share 2.配置java环境 vim /etc/ ...
- [转]webservice 采用SSL实现加密传输
本文转自:http://book.51cto.com/art/200906/129770.htm http://yeweiyun868.blog.163.com/blog/static/5637844 ...
- 1568: [JSOI2008]Blue Mary开公司(超哥线段树)
1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1198 Solved: 418 Descr ...
- hdu3366 Count the string
考虑dp[i]代表前缀s[1...i]出现的次数,必定有dp[nxt[i]] += dp[i] 倒着推就是了 #include <iostream> #include <cstrin ...
- sed处理大txt文件(1G) 比如替换某一串字符串,或者删除一行
1.将11.sql文件中"prompt"替换为"--prompt",然后保存为111.sql文件 sed -e "s,prompt,--prompt, ...
- “取出数据表中第10条到第20条记录”的sql语句+selecttop用法
1.首先,select top用法: 参考问题 select top n * from和select * from的区别 select * from table -- 取所有数据,返回无序集合 sel ...
- 第五篇:python基础_5
本篇内容 协程函数 递归 二分法 import语句 from...import语句 模块搜索路径 包的导入 软件开发规范 logging模块的使用 一. 协程函数 1.定义 协程函数就是使用了yiel ...
- POJ 2686 Traveling by Stagecoach(状压二维SPFA)
Traveling by Stagecoach Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3407 Accepted ...