codeforces912E(折半搜索+双指针+二分答案)
E. Prime Gift
3.5 seconds
256 megabytes
standard input
standard output
Opposite to Grisha's nice behavior, Oleg, though he has an entire year at his disposal, didn't manage to learn how to solve number theory problems in the past year. That's why instead of Ded Moroz he was visited by his teammate Andrew, who solemnly presented him with a set of n distinct prime numbers alongside with a simple task: Oleg is to find the k-th smallest integer, such that all its prime divisors are in this set.
The first line contains a single integer n (1 ≤ n ≤ 16).
The next line lists n distinct prime numbers p1, p2, ..., pn (2 ≤ pi ≤ 100) in ascending order.
The last line gives a single integer k (1 ≤ k). It is guaranteed that the k-th smallest integer such that all its prime divisors are in this set does not exceed 1018.
Print a single line featuring the k-th smallest integer. It's guaranteed that the answer doesn't exceed 1018.
3
2 3 5
7
8
5
3 7 11 13 31
17
93
The list of numbers with all prime divisors inside {2, 3, 5} begins as follows:
(1, 2, 3, 4, 5, 6, 8, ...)
The seventh number in this list (1-indexed) is eight.
/*
给定一个大小为n的素数集合
求出分解后只含这些质数因子的第k小整数
直接枚举判断显然不可以。
考虑折半搜索。可以把这16个数字拆成2个子集,各自生成所有大小1e18及以下的积。
但也需要使两个乘积组成的集合尽量接近。可以预先造出极限数据试一试集合里能有多少数
对于最坏情况,即如下数据
16
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53
分为2 3 5 7 11 13 和 17 19 23 29 31 37 41 43 47 53 两个集合时
这两个集合生成的1e18及以下的积的数量分别为 958460个 和 505756个,并不大
集合中数必须两两不等。
最后统计答案,
两个集合生成的积各自排一下序
然后二分答案,对于每个答案 u,可以O(|S|)双指针得到他是第几大。
具体做法是枚举从到小枚举第一个集合的积 t1,然后计算一下第二个集合的积中有多少积和 t1 相乘小于等于 u,
由于是从大到小枚举的,所以t1必然递增所以第二个集合的积中符合条件的积的数量也必然是递增的,所以只要扫一遍就行。
*/
#include<bits/stdc++.h> #define ll long long
#define inf 1e18
#define N 24 using namespace std;
vector<ll> seg[];
int p[N],n;
ll ansid; void dfs(int L,int R,ll val,int id)
{
seg[id].push_back(val);
for(int i=L;i<=R;i++)
if(inf/p[i]>=val) dfs(i,R,val*p[i],id);
} ll cnt(ll num)
{
int j=;
ll ret=;
for(int i=seg[].size()-;i>=;i--)
{
while(j<seg[].size() && seg[][j]<=num/seg[][i])
j++;
ret+=j;
}
return ret;
} void solve()
{
int i,j;
dfs(,min(,n),,);
dfs(min(,n)+,n,,);
sort(seg[].begin(),seg[].end());
sort(seg[].begin(),seg[].end());
ll L=,R=inf,mid;
while(L<R-)
{
mid=(L+R)>>;
if(cnt(mid)>=ansid) R=mid;
else L=mid;
}
cout<<R<<endl;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&p[i]);
cin>>ansid;
solve();
return ;
}
codeforces912E(折半搜索+双指针+二分答案)的更多相关文章
- 【BZOJ 2679】[Usaco2012 Open]Balanced Cow Subsets(折半搜索+双指针)
[Usaco2012 Open]Balanced Cow Subsets 题目描述 给出\(N(1≤N≤20)\)个数\(M(i) (1 <= M(i) <= 100,000,000)\) ...
- Codeforces 912E Prime Gift(预处理 + 双指针 + 二分答案)
题目链接 Prime Gift 题意 给定一个素数集合,求第k小的数,满足这个数的所有质因子集合为给定的集合的子集. 保证答案不超过$10^{18}$ 考虑二分答案. 根据折半的思想,首先我们把这个 ...
- codeforces 880E. Maximum Subsequence(折半搜索+双指针)
E. Maximum Subsequence time limit per test 1 second memory limit per test 256 megabytes input standa ...
- 洛谷P1528 切蛋糕 [搜索,二分答案]
题目传送门 切蛋糕 题目描述 Facer今天买了n块蛋糕,不料被信息组中球球等好吃懒做的家伙发现了,没办法,只好浪费一点来填他们的嘴巴.他答应给每个人留一口,然后量了量每个人口的大小.Facer有把刀 ...
- Codeforces 912E Prime Gift ( 二分 && 折半枚举 && 双指针技巧)
题意 : 给你 N ( 1 ≤ N ≤ 16 ) 个质数,然后问你由这些质数作为因子的数 ( 此数不超 10^18 ) & ( 不一定需要其因子包含所给的所有质数 ) 的第 k 个是什么 分析 ...
- E. Santa Claus and Tangerines 二分答案 + 记忆化搜索
http://codeforces.com/contest/752/problem/E 首先有一个东西就是,如果我要检测5,那么14我们认为它能产生2个5. 14 = 7 + 7.但是按照平均分的话, ...
- CF912E Prime Gift题解(搜索+二分答案)
CF912E Prime Gift题解(搜索+二分答案) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1314956 洛谷题目链接 $ $ CF题目 ...
- Luogu1084 NOIP2012D2T3 疫情控制 二分答案、搜索、贪心、倍增
题目传送门 题意太长就不给了 发现答案具有单调性(额外的时间不会对答案造成影响),故考虑二分答案. 贪心地想,在二分了一个时间之后,军队尽量往上走更好.所以我们预处理倍增数组,在二分时间之后通过倍增看 ...
- [题解](折半搜索)luogu_P4799_BZOJ_4800世界冰球锦标赛
抄的题解 以及参考:https://www.cnblogs.com/ZAGER/p/9827160.html 2^40爆搜过不了,考虑折半搜索,难点在于合并左右的答案,因为有可能答案同时载左右两边,我 ...
随机推荐
- Spring + RMI
服务端: RmiServer.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns= ...
- intelliJ IDEA工具快捷键
F9 resume programe 恢复程序 Alt+F10 show execution point 显示执行断点 F8 Step Ove ...
- Design Pattern Visitor 訪问者设计模式
訪问者设计模式是已经有了一组Person对象了,然后不同的訪问者訪问这组对象.会有不同效果. 这些訪问者实际上就是一个能够让Person对象组运行的动作行为等. 至于这些Person对象是怎样运行这些 ...
- iOS xmpp的使用
#import "AppDelegate.h" //#import "DBAreaItem.h" #pragma mark - #pragma mark Pri ...
- 简单了解eMMC
以下只是个人看法,有不妥之处,请批评指出. 参考资料:http://www.veryarm.com/1200.html 一.eMMC的发展 ROM→NorFlash→NandFlash→eMMC→UF ...
- IPython与Jupyter notebook 安装与配置,插件扩展,主题,PDF输出
基于 python2.7.13 32-bit版本安装 1.安装pyreadline https://pypi.python.org/pypi/pyreadline 下载对应的32位版本 安装Micro ...
- web.xml中的ServletContextListener
要想了解ServletContextListener,先看看web.xml中的<listener>配置. 一)web.xml中的内容载入顺序: 首先能够肯定的是,载入顺序与它们在 web. ...
- WWDC笔记:2011 Session 125 UITableView Changes, Tips and Tricks
What’s New Automatic Dimensions - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSect ...
- ORA-09817
连接数据库的时候报:ORA-09817:write to audit file,在网上搜索了下,发现时oracle安装目录下面的磁盘空间不够,有不少人给出了解决办法,下面即是一例: 连接oracle ...
- Cg入门23: Fragment shader – UV动画(序列帧)
让动画从1-9循环播放此纹理 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkF ...