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.... ...
随机推荐
- Problem I. Count - HDU - 6434(欧拉函数)
题意 给一个\(n\),计算 \[\sum_{i=1}^{n}\sum_{j=1}^{i-1}[gcd(i + j, i - j) = 1]\] 题解 令\(a = i - j\) 要求 \[\sum ...
- Patrick and Shopping
Patrick and Shopping 今天 Patrick 等待着他的朋友 Spongebob 来他家玩.为了迎接 Spongebob,Patrick 需要去他家附近的两家商店 买一些吃的.他家 ...
- 8、python中的集合
集合是python中无序.可变的数据结构.集合与字典类似,集合中的元素必须是可哈希的(等同于字典中的键),也就是说集合中的元素是唯一.不可变的数据类型.这里前面说集合可变,后面又说集合中的元素不可变是 ...
- Scrapy的架构与原理的理解【转】
Scrapy 框架 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页 ...
- php代码审计 strcmp和MD5函数漏洞
通过get得到三个值,v1,v2,v3. if第一层判断,v1和v2得到的值不一样,但是对它们进行md5加密后的值得相等. if第二层判断,v3得到的值得和$flag的值相等,满足这两个条件输出fla ...
- 爬虫:Scrapy1
Python 2.7 npm install scrapy 步骤: 创建一个 Scrapy 项目 定义提取的 Item 编写爬取网站的 Spider 并提取 Item 编写 Item Pipeline ...
- PAT A+B格式
A + B格式(20) 时间限制 400毫秒 内存限制 65536 kB 代码长度限制 16000 B. 判断程序 标准 作者 陈,岳 计算a + b并以标准格式输出总和 - 即数字必须用逗号分隔成三 ...
- 【转】 [UnityUI]UGUI射线检测
http://blog.csdn.net/lyh916/article/details/50947026 1.Graphic Raycaster 主要用于UI上的射线检测,挂有这个组件的物体,必须要挂 ...
- vmware安装centos7 安装redis windows7访问redis
1.在windows7中安装vmware 2.在vmware中安装centos7 3.禁用centos7自带的firewalld.service 4.安装iptables防火墙 5.安装Redis 3 ...
- hdu5985[概率dp] 2016青岛icpc现场赛
#include <bits/stdc++.h> using namespace std; ][]; ][]; ][]; ]; ]; int T, n; double fastpow(do ...