题解

可持久化可并堆

用\(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. wsimport生成客户端 指定编码格式

    wsimport -encoding utf- -keep -s D:\temp -p com.lawyer.user -verbose http://服务地址?wsdl -encoding : 指定 ...

  2. SQL语句(十五)视图

    视图 实际上是一个查询语句, 如果将子查询保存为视图, 就可以将子查询的结果当作数据表使用 从而来简化查询语句 引言 例1 查询参加"数据库技术"课程的考试的学生学号.姓名.班级. ...

  3. Java并发编程原理与实战四十五:问题定位总结

    背景   “线下没问题的”. “代码不可能有问题 是系统原因”.“能在线上远程debug么”    线上问题不同于开发期间的bug,与运行时环境.压力.并发情况.具体的业务相关.对于线上的问题利用线上 ...

  4. HDU 1242 Rescue (广搜)

    题目链接 Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The priso ...

  5. git之存储(git stash)-------(二)

    关于git stash命令的使用方法网上一大把,我想记录的是我在使用过程中觉得实用及好用的: 当在一个分支的开发工作未完成,却又要切换到另外一个分支进行开发的时候,可以先将自己写好的代码,储存在一个箱 ...

  6. 基于Vue + Vuex + Vue-router + Webpack 2.0打造微信界面

    一.项目简介 基于Vue + Vuex + Vue-router + Webpack 2.0打造微信界面,实现了微信聊天.搜索.点赞.通讯录(快速导航).个人中心.模拟对话.朋友圈.设置等功能. 二. ...

  7. Velocity VelocityEngine 支持多种loader 乱码问题

    最近升级团队的代码生成工具,此工具是velocity实现的. 之前习惯使用UTF-8编码,现在团队使用GBK. 所以遇到一种场景,模板文件使用UTF-8(习惯了所有任性),输出文件使用GBK(项目需要 ...

  8. [转]QVector与QByteArray——Qt的写时复制(copy on write)技术

    我们在之前的博文QVector的内存分配策略与再谈QVector与std::vector——使用装饰者让std::vector支持连续赋值中简单聊了聊QVector内存分配和赋值方面的一点东西,今天接 ...

  9. dump函数

    一.函数标准格式: DUMP(expr[,return_fmt[,start_position][,length]]) 基本参数时4个,最少可以填的参数是0个.当完全没有参数时,直接返回null.另外 ...

  10. 与JavaWeb有关的故事(Web请求与Java IO)

    作为一名后端屌丝程序员,对算法.并发.性能乐此不疲.但是,随着年龄和阅历的增加,显然叶落而不知秋的心态是不太能混了.尤其是,某T面试官在明知我是后端,且明确表示对HTTP协议不太熟的情况下,强行让我解 ...