链接

大意:求素因子只含给定素数的第k大数

先二分答案转为判定x是第几大, 然后分两块合并即可, 按奇偶分块可以优化一下常数

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define pb push_back using namespace std;
typedef long long ll; const int N = 2e5+10;
int a[N], b[N], f[N], n, m;
ll k;
vector<ll> s[2]; ll calc(ll x) {
ll ans = 0;
int now = 0;
PER(i,0,s[0].size()-1) {
while (now<s[1].size()&&s[1][now]<=x/s[0][i]) ++now;
ans += now;
}
return ans;
} void dfs(int d, int cur, ll now) {
s[d].pb(now);
REP(i,cur,*f) if (now<=1e18/f[i]) dfs(d,i,now*f[i]);
} int main() {
scanf("%d", &n);
REP(i,1,n) scanf("%d", a+i);
sort(a+1,a+1+n);
scanf("%lld", &k);
REP(i,1,n) if (i&1) f[++*f] = a[i];
dfs(0,1,1), *f = 0;
REP(i,1,n) if (i&1^1) f[++*f] = a[i];
dfs(1,1,1);
sort(s[0].begin(),s[0].end());
sort(s[1].begin(),s[1].end());
ll l = 1, r = 1e18, ans;
while (l<=r) {
int mid = (l+r)/2;
if (calc(mid)>=k) ans = mid, r = mid-1;
else l = mid+1;
}
printf("%lld\n", ans);
}

最新文章

  1. 安全防范:nginx下git引发的隐私泄露问题
  2. windows 用默认软件打开文档
  3. InnoDB O_DIRECT选项漫谈(一)【转】
  4. JS初学之-for套for遍历二维数组
  5. this,super关键字的使用
  6. 无法添加sql server ER图
  7. ASP.NET事务存储过程
  8. 2017-3-22 HTML 表单 、框架
  9. C语言之循环次数
  10. maven项目生成war包
  11. Scala编程入门---Map与Tuple
  12. 解决Android模拟器卡慢的问题
  13. 微信小程序 open-data更改样式 open-data 显示头像 圆形
  14. 封装cookie设置和获取的简易方法
  15. MapReduce shuffle过程剖析及调优
  16. oracle 根据一个时间段获取这个时间段内所有月份、天数、日期
  17. [No000016F]高并发下线程安全的单例模式(最全最经典)
  18. centos7.5安装golang
  19. Spring 注解原理(一)组件注册
  20. Jquery动态设置下拉框selected --(2018 08/12-08/26周总结)

热门文章

  1. Python的问题解决: IOError: [Errno 32] Broken pipe
  2. linux常用命令:at 命令
  3. java commons.lang3 ArrayUtils使用
  4. JUC原子类 1
  5. Linux中Postfix反病毒和垃圾邮件工具(十)
  6. EF 一个实体对象不能由多个 IEntityChangeTracker 实例引用 解决办法
  7. GreenOpenPaint的实现(五)矩形框
  8. 20145302张薇 《网络对抗》MSF应用基础
  9. Duilib 控件类html富文本绘制
  10. Python3基础 file open 打开txt文件并打印出全文