题目链接:Prime Gift

题意:

  给出了n(1<=n<=16)个互不相同的质数pi(2<=pi<=100),现在要求第k大个约数全在所给质数集的数。(保证这个数不超过1e18)

题解:

  如果暴力dfs的话肯定超时间,其实给的n数据范围最大是16是一个很奇妙的数(一般折半枚举基本上是这样的数据范围@。@~)。所以想到折半枚举,把所有的质数分成两份求出每份中所有小于1e18的满足条件的数。然后二分答案,写cheak函数时遍历第一个集合,对第二个集合二分(折半枚举基本上这个套路)。但是,这里一定要注意的是这里折半枚举指的并不是将n分成两份求出两个集合,而是要让分出的两份数所形成的集合中所含的个数接近,因为用较小的数形成的集合个数要多很多(被这个点卡了好久#。#)。

 #include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1e4+;
const long long INF = 1e18;
long long N,M,T,k;
long long vec[][MAX_N];
vector<long long> st[];
void dfs(int l,int r,long long rt,int id)
{
st[id].push_back(rt);
for(int i=l;i<r;i++)
{
if(INF/vec[id][i] >= rt)
dfs(i,r,rt*vec[id][i],id);
}
}
long long cheak_num(long long x)
{
long long ans = ;
for(int i=;i<st[].size();i++)
{
if(st[][i] )
ans += upper_bound(st[].begin(),st[].end(),x/st[][i]) - st[].begin();
}
return ans;
}
int main()
{
while(cin>>N)
{
st[].clear();st[].clear();
for(int i=;i<min((long long),N);i++) scanf("%lld",&vec[][i]);
for(int i=;i<N-min((long long),N);i++) scanf("%lld",&vec[][i]);
dfs(,min((long long),N),,);
dfs(,N-min((long long),N),,);
for(int i=;i<;i++)
sort(st[i].begin(),st[i].end()); cin>>k;
long long l=,r=INF;
while(l<=r)
{
long long mid = (l+r)>>;
if(cheak_num(mid) < k) l = mid+;
else r = mid-;
}
cout<<l<<endl;
}
return ;
}
/*
16
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53
755104793
*/

Codeforces 912 E.Prime Gift (折半枚举、二分)的更多相关文章

  1. CSU OJ PID=1514: Packs 超大背包问题,折半枚举+二分查找。

    1514: Packs Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 61  Solved: 4[Submit][Status][Web Board] ...

  2. CF912E Prime Gift题解(搜索+二分答案)

    CF912E Prime Gift题解(搜索+二分答案) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1314956 洛谷题目链接 $     $ CF题目 ...

  3. Codeforces H. Prime Gift(折半枚举二分)

    题目描述: Prime Gift time limit per test 3.5 seconds memory limit per test 256 megabytes input standard ...

  4. 【Codeforces 912E】Prime Gift

    Codeforces 912 E 题意:给\(n\leq16\)个素数\(p_1..p_n\),求第\(k\)个所有质因数都在\(n\)个数中的数. 思路:折半搜索...我原来胡搞毛搞怎么也搞不动\( ...

  5. Codeforces 888E - Maximum Subsequence(折半枚举(meet-in-the-middle))

    888E - Maximum Subsequence 思路:折半枚举. 代码: #include<bits/stdc++.h> using namespace std; #define l ...

  6. POJ 3977 Subset(折半枚举+二分)

    SubsetTime Limit: 30000MS        Memory Limit: 65536KTotal Submissions: 6754        Accepted: 1277 D ...

  7. Codeforces gym101612 L.Little Difference(枚举+二分)

    传送:http://codeforces.com/gym/101612 题意:给定一个数n(<=1e18),将n分解为若干个数的成绩.要求这些数两两之间的差值不能大于1. 分析: 若n==2^k ...

  8. Codeforces 734C Anton and Making Potions(枚举+二分)

    题目链接:http://codeforces.com/problemset/problem/734/C 题目大意:要制作n个药,初始制作一个药的时间为x,魔力值为s,有两类咒语,第一类周瑜有m种,每种 ...

  9. poj3977(折半枚举+二分查找)

    题目链接:https://vjudge.net/problem/POJ-3977 题意:给一个大小<=35的集合,找一个非空子集合,使得子集合元素和的绝对值最小,如果有多个这样的集合,找元素个数 ...

随机推荐

  1. Oracle GoldenGate OGG管理员手册(较早资料)

    第一章 系统实现简述 前言 编写本手册的目的是为系统管理员以及相关操作人员提供 Oracle  Goldengat  软 件的日常维护和使用的技术参考: 3 ORACLE 第二章 OGG 日常维护操作 ...

  2. NSOperation的使用细节 [3]

    NSOperation的使用细节 [3] 这一节我们来写自定义concurrent的operation,自定义concurrent的operation稍微有点复杂,需要按照某些既定的步骤编写才可以完成 ...

  3. Ogre学习教程:Ogre1.8.1+VS2010环境配置(转)

    http://blog.csdn.net/yangtrees/article/details/8724120 http://blog.csdn.net/cll611/article/details/8 ...

  4. 反射工具类.提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,被AOP过的真实类等工具函数.java

    import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.ap ...

  5. 张高兴的 Windows 10 IoT 开发笔记:使用 MAX7219 驱动数码管

    This is a Windows 10 IoT Core project on the Raspberry Pi 2/3, coded by C#. GitHub:https://github.co ...

  6. 静默安装oracle后,启动oem报错,解决方法!

    一.手工重建EM Oracle 的gridcontrol 由两部分组成:dbcontrol 和repository. 我们可以对某一部分进行操作,也可以同时进行操作. 这里先看一个因为修改hostna ...

  7. 2339: [HNOI2011]卡农

    Description 首先去除顺序不同算一种的麻烦,就是最后答案除以总片段数\(2^m-1\) 设\(f_i\)表示安排\(i\)个片段的合法种类 那么对于任何一个包含\(i-1\)个片段的序列(除 ...

  8. MySQL - FEDERATED引擎实现跨服务器查询

    1. MySQL插件的安装与卸载 # 查看插件信息 mysql> show plugins; mysql> select plugin_name,plugin_status,plugin_ ...

  9. iPhone 电脑备份路径

    C:\Users\iChen\AppData\Roaming\Apple Computer\MobileSync\Backup

  10. [转]C#调用C++类(以COM组件的形式)

    如果想用C#调用C/C++写的函数,可以先将C/C++的函数写成dll文件,由C#用DllImport的方式来调用,但是这种方法无法调用C++写的类,如果想调用C++类,可以先把C++类封装成COM组 ...