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. 关于HTTP返回码

    301与302区别: 301 重定向 三种主流搜索引擎(Google, Bing, Yahoo)对待301都是一样的.它们忽略原始链接然后把重定向后的新链接加入索引.例如:如果用301把 http:/ ...

  2. C# DataTable映射成Entity

    using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; ...

  3. jQuery报错:Uncaught TypeError: _this.attr is not a function

    问题:想通过延时把置灰的按钮再次复原,代码如下: $("#sendEmailCode").on("click", function() { var _this ...

  4. Java学习路径

    -------第一部分:基础语法-------- 1.输出语句 1.1 hello world 1.2 拼接输出.换行和不换行输出 1.3 拼接变量输出 2.输入语句: 2.1 定义变量,赋值(整数. ...

  5. if (strAreaCode.Find("体检")>=0)

    string类提供了6种查找函数,每种函数以不同形式的find命名. 这些操作全部返回string::size_type类型的值,以下形式标记查找匹配所发生的位置: 或者返回一个名为string::n ...

  6. php 栈、 出栈、入栈

    最近在面试的时候被问到栈,回来做个总结,希望对大家有帮助 栈是线性表的一种,他的特点是后入先出,可以这么理解,栈就像一个存东西的盒子,先放进去的在最底层,后放进去的在上层,因为上层的东西把底层的东西压 ...

  7. 1.CentOS 7 vs CentOS 6的不同

    CentOS 7 vs CentOS 6的不同(1)桌面系统[CentOS6] GNOME 2.x[CentOS7] GNOME 3.x(GNOME Shell)   (2)文件系统[CentOS6] ...

  8. Educational Codeforces Round 71 (Rated for Div. 2) Solution

    A. There Are Two Types Of Burgers 题意: 给一些面包,鸡肉,牛肉,你可以做成鸡肉汉堡或者牛肉汉堡并卖掉 一个鸡肉汉堡需要两个面包和一个鸡肉,牛肉汉堡需要两个面包和一个 ...

  9. 图数据库-Neo4j-初探

    图数据库-Neo4j-初探 2018-08-17 本次初探主要学习如何安装Neo4j,以及Cypher的基本语法. 1. 安装Neo4j Desktop版本 neo4j-desktop Server版 ...

  10. MyBatis 源码篇-日志模块1

    在 Java 开发中常用的日志框架有 Log4j.Log4j2.Apache Common Log.java.util.logging.slf4j 等,这些日志框架对外提供的接口各不相同.本章详细描述 ...