题意 : 给你 N ( 1 ≤ N ≤ 16 ) 个质数,然后问你由这些质数作为因子的数 ( 此数不超 10^18 ) & ( 不一定需要其因子包含所给的所有质数 ) 的第 k 个是什么

分析 : 

由于各项的数据范围都太过于大,所以考虑从比较小的 N 入手

由于 N 比较小,所以可以先到是否能折半枚举,先将质数分成两个集合

然后分别处理出两个集合的所有不超过 10^18 次方的以集合内的数作为因子的数(DFS可以构造)

最后这些数的个数貌似是可以接受的,至于证明貌似出题人也在题解评论下面说可以暴力跑一下看看 ( 误

分成两个集合处理完之后将两个集合排序,接下来的工作就是上下界分别为 0 和 10^18 去二分答案

二分的判断函数需要做到==>给出一个数,然后判断在两个有序数组元素两两乘积里面排第几

这里可以用一个双指针技巧 O(N) 地做到

先从大到小枚举其中一个集合,那么 (当前二分数) / (第一集合的数) 这个商是越来越大的

而当满足 (第二集合的数) ≤ (当前二分数) / (第一集合的数) 那么说明有一个乘积在当前二分数的后面

由于不等式右边是逐渐增大的,所以只要我们从小到达枚举第二集合的数,即可下次不必从头开始判断

因此是 O(N) 的,可能需要看一下代码有助于理解。

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const LL INF = 1e18;
vector<];
];
LL K;

///DFS构造以集合内质数为因子的数,注意DFS的写法,可以做到不重复
void DFS(int L, int R, LL val, const int idx)
{
    vet[idx].push_back(val);
    for(int i=L; i<=R; i++)
        if(INF / (LL)num[i] >= val)
            DFS(i, R, val*(LL)num[i], idx);
}

LL Order(LL NUM)
{
    ;
    LL cnt = ;
    ].size()-; i>=; i--){///双指针技巧
        ].size() &&
              vet[][j] <= NUM / vet[][i])///不等式右边是逐渐变大的
                j++;
        cnt += j;
    }
    return cnt;
}

int main(void)
{
    scanf("%d", &N);
    ; i<=N; i++)
        scanf("%d", &num[i]);
    scanf("%I64d", &K);

    sort(num+, num++N);
    ,j=N; i<j; i+=,j-=)
        swap(num[i], num[j]);

    DFS(, min(, N), , );
    DFS(min(, N)+, N, , );

    sort(vet[].begin(), vet[].end());
    sort(vet[].begin(), vet[].end());

    LL L = , R = INF, mid, ans;
    while(L <= R){
        mid = L + ((R - L)>>);
        ;
        ;
    }

    );
}

Codeforces 912E Prime Gift ( 二分 && 折半枚举 && 双指针技巧)的更多相关文章

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

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

  2. Codeforces 912E - Prime Gift

    912E - Prime Gift 思路: 折半枚举+二分check 将素数分成两个集合(最好按奇偶位置来,保证两集合个数相近),这样每个集合枚举出来的小于1e18的积个数小于1e6. 然后二分答案, ...

  3. Codeforces 912E Prime Gift(预处理 + 双指针 + 二分答案)

    题目链接 Prime Gift 题意  给定一个素数集合,求第k小的数,满足这个数的所有质因子集合为给定的集合的子集. 保证答案不超过$10^{18}$ 考虑二分答案. 根据折半的思想,首先我们把这个 ...

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

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

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

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

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

    题意:有一个N(N <= 35)个数的集合,每个数的绝对值小于等于1015,找一个非空子集,使该子集中所有元素的和的绝对值最小,若有多个,则输出个数最小的那个. 分析: 1.将集合中的元素分成两 ...

  7. F. Make Them Similar ( 暴力折半枚举 + 小技巧 )

    传送门 题意: 给你 n 个数 a[ 1 ]  ~ a[ n ], n <= 100: 让你找一个 x , 使得 a[ 1 ] = a[ 1 ] ^ x ~ a[ n ] = a[ n ] ^ ...

  8. Codeforces 912 E.Prime Gift (折半枚举、二分)

    题目链接:Prime Gift 题意: 给出了n(1<=n<=16)个互不相同的质数pi(2<=pi<=100),现在要求第k大个约数全在所给质数集的数.(保证这个数不超过1e ...

  9. codeforces912E(折半搜索+双指针+二分答案)

    E. Prime Gift E. Prime Gift time limit per test 3.5 seconds memory limit per test 256 megabytes inpu ...

随机推荐

  1. git上传项目到github教程

    1 本地下载git 2 进到你项目所在地 3 git init(初始化git仓) 4 git add .(git add <file>将文件添加到git) 5 git commit -m ...

  2. Java并发ReadWriteLock接口

    java.util.concurrent.locks.ReadWriteLock接口允许一次读取多个线程,但一次只能写入一个线程. 读锁 - 如果没有线程锁定ReadWriteLock进行写入,则多线 ...

  3. 2019JAVA第七次实验报告

    Java实验报告 班级 计科二班 学号 20188442 姓名 吴怡君 完成时间 2019.10.25 评分等级 实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)1 ...

  4. A*算法【拼图游戏】

    数据结构 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sys ...

  5. Python文件的几种读写方式

    1). "w "写模式,它是不能读的,如果用w模式打开一个已经存在的文件,会清空以前的文件内容,重新写 "w+ "是读写内容,只要沾上w,肯定会清空原来的文件2 ...

  6. requests实现文件下载, 期间显示文件信息&下载进度_python3

    requests实现文件下载, 期间显示文件信息&下载进度 """使用模块线程方式实现网络资源的下载 # 实现文件下载, 期间显示文件信息&下载进度 # ...

  7. 云服务器linux重新挂载指定目录(非扩充)

    新买的香港云服务器,系统只能在商家的控制台上安装. 系统和硬盘分开的,根目录空间只有10G.需要重新设置相关目录的大小,如:/usr./var./home等. 以下是自己的解决方法小计. 一.初始的分 ...

  8. 深入理解java虚拟机(1)走进jvm

    1.JDK:java程序设计语言.java虚拟机.javaAPI 二.自动内存管理机制 ----------------------------------------------------- 1. ...

  9. java中常见的异常种类

    Java常见的异常种类 ------------------------------------------------------------------------------- java Exc ...

  10. python接口自动化 - Requests-3 高级用法

    高级用法 本篇文档涵盖了 Requests 的一些高级特性. 会话对象 会话对象让你能够跨请求保持某些参数.它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 url ...