题解

可持久化可并堆

用\(f[i,j]\)表示最大的质数标号为i,然后有j个质数乘起来

用\(g[i,j]\)表示\(\sum_{k = 1}^{i}f[k,j]\)

转移是

\(f[i,j] = \sum_{k= 1}^{j} g[i - 1,j - k] * p_{i}^{k}\)

\(g[i,j] += f[i,j]\)

这就要资瓷两个集合的合并了

可是集合显然非常大,我们可以用可持久化来帮助完成这件事,就完成了

代码

#include <bits/stdc++.h>
#define enter putchar('\n')
#define space putchar(' ')
#define pii pair<int,int>
#define fi first
#define se second
#define MAXN 1000005
#define pb push_back
#define mp make_pair
#define eps 1e-8
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
int64 N;
int K,prime[105],tot;
bool nonprime[205];
int64 pw[105];
struct node {
node *lc,*rc;
int64 mul,val;
int dis;
}pool[17000000],*tail = pool;
struct set_node {
int64 val;node *rt;
set_node(){}
set_node(int64 _v,node *r) {
val = _v;rt = r;
}
friend bool operator < (const set_node &a,const set_node &b) {
return a.val > b.val;
}
friend bool operator == (const set_node &a,const set_node &b) {
return a.val == b.val && a.rt == b.rt;
}
};
node *g[105],*f[105];
set<set_node > S;
node *Newnode(int64 v) {
node *res = tail++;
res->mul = 1;res->val = v;
res->lc = res->rc = NULL;
res->dis = 0;
return res;
}
int getdist(node *p) {
return p ? p->dis : -1;
}
node* addlazy(node *u,int64 val) {
if(!u) return NULL;
node *res = tail++;
*res = *u;
res->val *= val;
res->mul *= val;
return res;
}
void push_down(node *&u) {
if(u->mul != 1) {
u->lc = addlazy(u->lc,u->mul);
u->rc = addlazy(u->rc,u->mul);
u->mul = 1;
}
}
node *Merge(node *A,node *B) {
if(!A) return B;
if(!B) return A;
if(A->val < B->val) swap(A,B);
push_down(A);
node *res = tail++;
*res = *A;
res->rc = Merge(A->rc,B);
if(getdist(res->rc) > getdist(res->lc)) swap(res->lc,res->rc);
res->dis = getdist(res->rc) + 1;
return res;
}
void Solve() {
read(N);read(K);
for(int i = 2 ; i <= 128 ; ++i) {
if(!nonprime[i]) {
prime[++tot] = i;
for(int j = 2 ; j <= 128 / i ; ++j) {
nonprime[i * j] = 1;
}
}
}
for(int i = 0 ; i <= 100 ; ++i) g[i] = NULL;
g[0] = Newnode(1);
for(int i = 1 ; i <= tot ; ++i) {
int cnt = 0;int64 t = N;
while(t >= prime[i]) {t /= prime[i];++cnt;}
pw[0] = 1;
for(int k = 1 ; k <= cnt ; ++k) pw[k] = pw[k - 1] * prime[i];
for(int k = 1 ; k <= cnt ; ++k) {
f[k] = NULL;
for(int h = 1 ; h <= k ; ++h) {
f[k] = Merge(f[k],addlazy(g[k - h],pw[h]));
}
}
for(int k = 1 ; k <= cnt ; ++k) g[k] = Merge(g[k],f[k]);
}
node *rt = NULL;
for(int i = 1 ; i <= 100 ; ++i) rt = Merge(rt,g[i]);
S.insert(set_node(rt->val,rt));
for(int i = 1 ; i < K ; ++i) {
set_node p = *S.begin();
S.erase(S.begin());
push_down(p.rt);
if(p.rt->lc) S.insert(set_node(p.rt->lc->val,p.rt->lc));
if(p.rt->rc) S.insert(set_node(p.rt->rc->val,p.rt->rc));
while(S.size() > K - i) S.erase(--S.end());
}
out((*S.begin()).val);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}

【LOJ】#2047. 「CQOI2016」伪光滑数的更多相关文章

  1. loj #2044. 「CQOI2016」手机号码

    #2044. 「CQOI2016」手机号码 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  2. Loj 2047 伪光滑数

    Loj 2047 伪光滑数 正解较复杂,但这道题其实可以通过暴力解决. 预处理出 \(128\) 内的所有质数,把 \(n\) 内的 \(prime[i]^j\) 丢进堆中,再尝试对每个数变形,除一个 ...

  3. 【BZOJ4524】[Cqoi2016]伪光滑数 堆(模拟搜索)

    [BZOJ4524][Cqoi2016]伪光滑数 Description 若一个大于1的整数M的质因数分解有k项,其最大的质因子为Ak,并且满足Ak^K<=N,Ak<128,我们就称整数M ...

  4. @bzoj - 4524@ [Cqoi2016]伪光滑数

    目录 @description@ @solution@ @version - 1@ @version - 2@ @accepted code@ @version - 1@ @version - 2@ ...

  5. 【BZOJ-4524】伪光滑数 堆 + 贪心 (暴力) [可持久化可并堆 + DP]

    4524: [Cqoi2016]伪光滑数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 183  Solved: 82[Submit][Status] ...

  6. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  7. LoibreOJ 2042. 「CQOI2016」不同的最小割 最小割树 Gomory-Hu tree

    2042. 「CQOI2016」不同的最小割 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  8. 2021.08.01 P4359 伪光滑数(二叉堆)

    2021.08.01 P4359 伪光滑数(二叉堆) [P4359 CQOI2016]伪光滑数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 若一个大于 11 的整数 MM ...

  9. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

随机推荐

  1. 转:UIViewController中各方法调用顺序及功能详解

    UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, viewWillAppear, viewDidAppear ...

  2. Eclipse中遇到main方法不能运行 的情况

    java.lang.UnsupportedClassVersionError: Bad version number in .class file 造成这种过错是ni的支撑Tomcat运行的JDK版本 ...

  3. jmeter乱码问题

    JMeter 的版本由 2.13 升级到了 3.0 发现之前接口脚本 POST 请求主体中的中文无法正确显示,现象如下图所示:

  4. idea 常用快捷使用

    一.智能提示 1.快速移动到错误代码 :Shift+F2 或者 f2/ 2.快速修复:Alt+Enter 3.快速生成括号:Ctrl+Shift+Enter 二.重构 1.重构功能汇总:Ctrl+Sh ...

  5. nginx.conf 基础配置

    ### 全局块开始### #配置允许运行nginx服务器的用户和用户组 user nobody; #配置允许nginx进程生成的worker process 数 worker_processes 1; ...

  6. 男女通用的减肥计划 10分钟家庭hiit训练

    在大城市的年轻人,一般都会比较忙,晚上下班吃完饭,到家就要8-9点了,再让他们去,有时候真的不太方便. 其实你如果想要,也不一定要,在家里做hiit运动,就可以了. hiit(高强度间歇运动),是目前 ...

  7. 可供选择CSS框架

    在这里你有一个很酷的框架,收集创建的CSS布局. 如果你不喜欢框架,宁愿使用自己的手写代码以促进自己的发展,请跳过本篇文章. 我想有一个建设性的意见,那就是有选择的使用其优点避开其缺点. 就个人而言, ...

  8. Druid.io启用SQL支持

    Druid.io的SQL功能虽然在试验阶段,但是也支持了大部分的功能,而且还可以通过 Avatica JDBC查看请求的json,有助于我们理解Druid.io的语法.Druid.io有个比较坑的是, ...

  9. kafka入门(3)- SpringBoot集成Kafka

    1.引入依赖 <dependency> <groupId>org.springframework.kafka</groupId> <artifactId> ...

  10. [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)

    [NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...