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

标签:题解

阅读体验:https://zybuluo.com/Junlier/note/1314956

洛谷题目链接 $ \ \ \ \ $ CF题目链接

先翻译一下题意

给你\(n\)个质数,让你求这\(n\)个质数能乘起来组成的第\(K\)大数(\(n\le 16,K\)好大八大)

思路

看到这个数据范围,很容易想到搜索对吧

但是又不能盲目地搜索,考虑\(meet-in-the-middle\)

搜出前\(8\)个和后\(8\)个能拼出的所有状态

很显然随便算一下是存的下来的(不确定数组开多大就开个\(vector\))

我们发现还是无法很快找到第\(K\)大的答案对吧

这种时候就应该想到二分答案\(+check\)来解决,那么我们对答案二分

问题就转化成了给你一个数和两个数列,让你找出它在这两个数列中每个数列任选两个乘起来的数中排名为多少

这个就不是很难了,那两个指针扫一遍就完事了。。。

如果不知道怎么扫的话可以考虑看一看代码(如果你看得懂的话)

Code(日常没注释)

#include<bits/stdc++.h>
#define il inline
#define rg register
#define ldb double
#define lst long long
#define rgt register int
#define N 20
#define pb push_back
using namespace std;
const lst Inf=1e18;
il int read()
{
int s=0,m=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')m=1;ch=getchar();}
while( isdigit(ch))s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
} lst n,K;
vector<lst> v[3];
lst p[N],Sz[3]; void Dfs(int rt,int now,lst ss)
{
if(now>n){v[rt].pb(ss),++Sz[rt];return;}
for(lst w=1;;w*=p[now])
{
Dfs(rt,now+2,ss*w);
if((1e18)/p[now]<w*ss)return;
//用除法是因为怕爆long long
}
} int main()
{
n=read(),v[1].pb(0),v[2].pb(0);
for(rgt i=1;i<=n;++i)p[i]=read();
sort(&p[1],&p[n+1]),Dfs(1,1,1),Dfs(2,2,1);
sort(&v[1][1],&v[1][Sz[1]+1]);
sort(&v[2][1],&v[2][Sz[2]+1]);
lst le=1,ri=1e18,mid,tot,Ans;K=read();
while(le<=ri)
{
mid=(le+ri)>>1,tot=0;
for(rgt i=1,j=Sz[2];i<=Sz[1]&&j>=1;++i,tot+=j)
while(j&&mid/v[1][i]<v[2][j])--j;//用除法是因为怕爆long long
if(tot<K)le=mid+1;
else Ans=mid,ri=mid-1;
}return printf("%lld\n",Ans),0;
}

CF912E Prime Gift题解(搜索+二分答案)的更多相关文章

  1. $CF912E\ Prime\ Gift$ 二分+搜索

    正解:二分+搜索 解题报告: 传送门$QwQ$ 因为翻译真的很$umm$所以还是写下题目大意$QwQ$,就说给定一个大小为$n$的素数集合,求出分解后只含这些质数因子的第$K$小整数 考虑先把质数分两 ...

  2. 【题解】 [HEOI2016]排序题解 (二分答案,线段树)

    题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行 ...

  3. CF912E Prime Gift 数学

    Opposite to Grisha's nice behavior, Oleg, though he has an entire year at his disposal, didn't manag ...

  4. [NOIP2012提高]借教室 题解(二分答案+差分)

    [NOIP2012提高&洛谷P1083]借教室 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室 ...

  5. [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)

    [CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...

  6. [NOIP2015提高&洛谷P2678]跳石头 题解(二分答案)

    [NOIP2015提高&洛谷P2678]跳石头 Description 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之 ...

  7. [NOIP提高&洛谷P1024]一元三次方程求解 题解(二分答案)

    [NOIP提高&洛谷P1024]一元三次方程求解 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约 ...

  8. 3月28日考试 题解(二分答案+树形DP+数学(高精))

    前言:考试挂了很多分,难受…… --------------------- T1:防御 题意简述:给一条长度为$n$的序列,第$i$个数的值为$a[i]$.现让你将序列分成$m$段,且让和最小的一段尽 ...

  9. CF912E Prime Gift

    传送门 看到\(n\)只有16,可以把这些质数分成两半,然后预处理出这些数相乘得出的小于\(10^{18}\)的所有数,排个序,然后二分最终答案,再用两个指针从前往后和从后往前扫,进行\(two-po ...

随机推荐

  1. 【leetcode】1171. Remove Zero Sum Consecutive Nodes from Linked List

    题目如下: Given the head of a linked list, we repeatedly delete consecutive sequences of nodes that sum ...

  2. 【bzoj2724】[Violet 6]蒲公英

    *题目描述: *输入: 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 *输出: *样例输入: 6 3 1 2 3 2 1 ...

  3. hihocoder1286 : 子矩阵求和

    http://hihocoder.com/problemset/problem/1286 题解 NB分析题. 首先我们令\(s[i][j]\)表示以\((i,j)\)为左上角的矩形的权值和. 因为\( ...

  4. js基础补漏

    1.for...in 和 for...of有何区别 for ... in循环由于历史遗留问题,它遍历的实际上是对象的属性名称.一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性. ...

  5. UVALive 6855 Banks (暴力)

    Banks 题目链接: http://acm.hust.edu.cn/vjudge/contest/130303#problem/A Description http://7xjob4.com1.z0 ...

  6. JavaScript code modules

    https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules Non-standardThis feature is ...

  7. 移动端轮播完整版css3加原生写法

    <!doctype html><html><head> <meta charset="UTF-8"> <meta name=& ...

  8. Android传感器系统架构【转】

    本文转载自:http://blog.csdn.net/qianjin0703/article/details/5942579 版权声明:本文为博主原创文章,未经博主允许不得转载. 1. 体系结构 2. ...

  9. MySQL删除外键约束问题

    当我们在一个表中添加字段约束的时候: ALTER TABLE product ADD CONSTRAINT product_fk FOREIGN KEY(category_id) REFERENCES ...

  10. P1439 【模板】最长公共子序列(LCS)

    先来看一看普通的最长公共子序列 给定字符串A和B,求他们的最长公共子序列 DP做法: 设f[i][j]表示A[1~i]和B[1~j]的最长公共子序列的长度 那么f[i][j]=max(f[i-1][j ...