OvO http://codeforces.com/contest/912/problem/E

  首先把这个数字拆成个子集,各自生成所有大小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个,并不大,而且两个集合中的积必定是两两不相等的(除了)。

  记两个集合大小的和为 |S|

  两个集合生成的积各自排一下序

  然后二分答案,对于每个答案 u,可以 O(|S|) 得到他是第几大。

  具体做法是枚举从到小枚举第一个集合的积 t1,然后计算一下第二个集合的积中有多少积和 t1 相乘小于等于 u,

  由于是从大到小枚举的,所以 t1 必然递增,所以第二个集合的积中符合条件的积的数量也必然是递增的,所以只要扫一遍就行。

  然后要注意的是直接用 long long 来进行计算比较好,double的精度貌似不太够

  (参考自这里->http://codeforces.com/contest/912/submission/33938779

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <vector> using namespace std; typedef long long ll; const ll INF=1e18;
const int N=24; vector<ll> seg[2];
int p[N],n;
ll ansid; void dfs(int li,int ri,ll val,int id)
{
seg[id].push_back(val);
for(int i=li;i<=ri;i++)
if(INF/p[i]>=val)
dfs(i,ri,val*p[i],id);
} ll cnt(ll num)
{
int j=0;
ll ret=0;
for(int i=seg[0].size()-1;i>=0;i--)
{
while(j<seg[1].size() && seg[1][j]<=num/seg[0][i])
j++;
ret+=j;
}
return ret;
} void solve()
{
int i,j;
dfs(1,min(6,n),1,0);
dfs(min(6,n)+1,n,1,1);
sort(seg[0].begin(),seg[0].end());
sort(seg[1].begin(),seg[1].end());
// cout<<seg[0].size()<<' '<<seg[1].size()<<endl;
ll li=0,ri=INF,mid;
while(li<ri-1)
{
mid=(li+ri)>>1;
if(cnt(mid)>=ansid)
ri=mid;
else li=mid;
}
printf("%I64d\n",ri);
} int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&p[i]);
scanf("%I64d",&ansid);
solve();
return 0;
} /* 16
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53
2 */

  

Codeforces Round #456 (Div. 2) 912E E. Prime Gift的更多相关文章

  1. Codeforces Round #456 (Div. 2)

    Codeforces Round #456 (Div. 2) A. Tricky Alchemy 题目描述:要制作三种球:黄.绿.蓝,一个黄球需要两个黄色水晶,一个绿球需要一个黄色水晶和一个蓝色水晶, ...

  2. Codeforces Round #456 (Div. 2) B. New Year's Eve

    传送门:http://codeforces.com/contest/912/problem/B B. New Year's Eve time limit per test1 second memory ...

  3. Codeforces Round #456 (Div. 2) A. Tricky Alchemy

    传送门:http://codeforces.com/contest/912/problem/A A. Tricky Alchemy time limit per test1 second memory ...

  4. Codeforces Round #456 (Div. 2) 912D D. Fishes

    题: OvO http://codeforces.com/contest/912/problem/D 解: 枚举每一条鱼,每放一条鱼,必然放到最优的位置,而最优位置即使钓上的概率最大的位置,即最多的r ...

  5. Codeforces Round #456 (Div. 2) B. New Year's Eve

    B. New Year's Eve time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  6. 【Codeforces Round #456 (Div. 2) A】Tricky Alchemy

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 统计需要的个数. 不够了,就买. [代码] #include <bits/stdc++.h> #define ll lo ...

  7. 【Codeforces Round #456 (Div. 2) B】New Year's Eve

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然10000..取到之后 再取一个01111..就能异或成最大的数字了. [代码] /* 1.Shoud it use long ...

  8. 【Codeforces Round #456 (Div. 2) C】Perun, Ult!

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] set1 < pair < int,int > > set1;记录关键点->某个人怪物永远打不死了,第 ...

  9. Codeforces Round #456 (Div. 2) B题

    B. New Year's Evetime limit per test1 secondmemory limit per test256 megabytesinputstandard inputout ...

随机推荐

  1. Python解Leetcode: 725. Split Linked List in Parts

    题目描述:给定一个单链表,写一个函数把它分成k个单链表.分割成的k个单链表中,两两之间长度差不超过1,允许为空.分成的k个链表中,顺序要和原先的保持一致,比如说每个单链表有3个结点,则第一个单链表的结 ...

  2. (十五)mybatis 逆向工程

    目录 为什么需要逆向工程 使用方法 如何读懂生成的代码 总结 为什么需要逆向工程 对于数据库中的那么多的表 ,基本的 CRUD 操作 ,以及 mybatis 需要使用的 接口.mapper ,这些工作 ...

  3. python-day3(正式学习)

    执行python的两种方式 交互式 优点:运行一句执行一句,方便修改 缺点:关闭即消失,无法保存 命令行式 优点:能一直保存 缺点:代码全部写完才可以调试bug 以后尽量使用pycharm和jupyt ...

  4. python 基础(十五)--time和datatime模块

    time模块 time.time():返回当前时间,时间戳 time.clock():返回cpu时间(?),当有time.sleep()时,time.clock()不计时 time.localtime ...

  5. java包装类的缓存机制(转)

    出处: java包装类的缓存机制 java 包装类的缓存机制,是在Java 5中引入的一个有助于节省内存.提高性能的功能,只有在自动装箱时有效 Integer包装类 举个栗子: Integer a = ...

  6. varnish 子程序流程

    VCL中主要动作: pass:当一个请求被pass后,这个请求将通过varnish转发到后端服务器,该请求不会被缓存,后续的请求仍然通过Varnish处理.pass可以放在vcl_recv 和vcl_ ...

  7. skywalking-agent 与docker组合使用

    docker部署 公司有使用docker部署的微服务 可以直接使用  仓库/java:8-jdk-alpine-asla-shanghai-1-skyagent-2作为基础镜像 这个镜像包是java8 ...

  8. Css解决表格超出部分用省略号显示

    小伙伴们有没有的遇到页面显示时,因为数据太长导致显示的表格某一列过长,从而导致页面的不美观,下面我们来看一看如何用Css样式解决表格超出部分用省略号显示的问题. 主要设置两个样式: table{ ta ...

  9. SpringBoot的启动配置原理

    一.启动流程 创建SpringApplication对象 public class SpringApplication { public SpringApplication(Class... prim ...

  10. Spark面试知识点-SparkSQL(1)

    0.介绍: (1)Spark SQL的前身是Shark,即Hive on Spark, 1.SparkSQL特点: (1)支持多种数据源:Hive,RDD,Parquet,JSON,JDBC等. (2 ...