Codeforces 912E Prime Gift ( 二分 && 折半枚举 && 双指针技巧)
题意 : 给你 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 ( 二分 && 折半枚举 && 双指针技巧)的更多相关文章
- Codeforces H. Prime Gift(折半枚举二分)
题目描述: Prime Gift time limit per test 3.5 seconds memory limit per test 256 megabytes input standard ...
- Codeforces 912E - Prime Gift
912E - Prime Gift 思路: 折半枚举+二分check 将素数分成两个集合(最好按奇偶位置来,保证两集合个数相近),这样每个集合枚举出来的小于1e18的积个数小于1e6. 然后二分答案, ...
- Codeforces 912E Prime Gift(预处理 + 双指针 + 二分答案)
题目链接 Prime Gift 题意 给定一个素数集合,求第k小的数,满足这个数的所有质因子集合为给定的集合的子集. 保证答案不超过$10^{18}$ 考虑二分答案. 根据折半的思想,首先我们把这个 ...
- Codeforces 888E - Maximum Subsequence(折半枚举(meet-in-the-middle))
888E - Maximum Subsequence 思路:折半枚举. 代码: #include<bits/stdc++.h> using namespace std; #define l ...
- $CF912E\ Prime\ Gift$ 二分+搜索
正解:二分+搜索 解题报告: 传送门$QwQ$ 因为翻译真的很$umm$所以还是写下题目大意$QwQ$,就说给定一个大小为$n$的素数集合,求出分解后只含这些质数因子的第$K$小整数 考虑先把质数分两 ...
- POJ - 3977 Subset(二分+折半枚举)
题意:有一个N(N <= 35)个数的集合,每个数的绝对值小于等于1015,找一个非空子集,使该子集中所有元素的和的绝对值最小,若有多个,则输出个数最小的那个. 分析: 1.将集合中的元素分成两 ...
- F. Make Them Similar ( 暴力折半枚举 + 小技巧 )
传送门 题意: 给你 n 个数 a[ 1 ] ~ a[ n ], n <= 100: 让你找一个 x , 使得 a[ 1 ] = a[ 1 ] ^ x ~ a[ n ] = a[ n ] ^ ...
- Codeforces 912 E.Prime Gift (折半枚举、二分)
题目链接:Prime Gift 题意: 给出了n(1<=n<=16)个互不相同的质数pi(2<=pi<=100),现在要求第k大个约数全在所给质数集的数.(保证这个数不超过1e ...
- codeforces912E(折半搜索+双指针+二分答案)
E. Prime Gift E. Prime Gift time limit per test 3.5 seconds memory limit per test 256 megabytes inpu ...
随机推荐
- HTML简单介绍(个人角度)
之前对HTML的理解:HTML主要是标签组成,一对标签组成一个位置,在响应的位置内填写对应的内容. 1.编译工具 [ ] HTML需要编译工具?txt文档改后缀双击运行. [ ] 了解前端了一下前端, ...
- PostgreSQL数据库表的内部结构
A page within a table contains three kinds of data described as follows: heap tuple(s) – A heap tupl ...
- olap和Oltp(转)
OLAP和OLTP的区别(基础知识) 联机分析处理 (OLAP) 的概念最早是由关系数据库之父E.F.Codd于1993年提出的,他同时提出了关于OLAP的12条准则.OLAP的提出引起了很大的反响, ...
- 单例模式 之 单例模式——Holder
之前我写过 单例模式中的饿汉模式和懒汉模式 他们虽然都能实现单例模式 但是优缺点很明显 饿汉模式:不能懒加载(类加载就会被实例化),消耗很大,在并发情况下安全性很高. 懒汉模式:能实现懒加载,但是在并 ...
- RabbitMQ入门教程(二):简介和基本概念
原文:RabbitMQ入门教程(二):简介和基本概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...
- centos7配置fastdfs集群(5.09)
centos7配置fastdfs集群(5.09) 2017年03月10日 23:34:26 带鱼兄 阅读数 1564 版权声明:本文为博主原创文章,转载请注明出处. https://blog.c ...
- [转载]Linux内核编译
原文地址:https://blog.csdn.net/qq_34247099/article/details/50949720 写在前面的话: 本人大二,东南大学一个软工狗,正在修一门名为<操作 ...
- --解决Lock wait timeout exceeded; try restarting transaction
--解决Lock wait timeout exceeded; try restarting transaction select * from information_schema.innodb_t ...
- mysql小数和类型转换函数
保留两位小数 SELECT ROUND( 123456789.3563898,2),TRUNCATE(123456789.3563898,2),FORMAT(123456789.3563898,2); ...
- 使用QtXlsx来读写excel文件
概述:QtXlsx是功能非常强大和使用非常方便的操作excel类库.包括对excel数据读写.excel数据格式设置及在excel里面根据数据生成各种图表. 下面重点介绍如何安装和使用QtXlsx. ...