题目描述

若一个大于1的整数M的质因数分解有k项,其最大的质因子为Ak,并且满足Ak^K<=N,Ak<128,我们就称整数M为N-伪
光滑数。现在给出N,求所有整数中,第K大的N-伪光滑数。
题解
题面的k意思是将这个数质因数分解后所有的质因子的指数和。
我们先把128以内的所有素数找出来,然后做一个dp
我们令dp[i][j]表示当前数的最大的质因子为p[i],当前所有素因子的指数和为j的数的集合。
我们再令g[i][j]表示当指数和位j时,所有最大质因子小于等于p[i]的数的集合。
然后我们可以合并集合。
f[i][j]=∑g[i-1][j-k]*p[i]k
g[i][j]=g[i-1][j]+f[i][j]
然后我们可以用函数式可并堆来维护所有的转移,在开一个全局的堆来维护所有的f。
然后一直弹堆顶就可以了。
注意pushdown
代码
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
typedef long long ll;
int tot,prime[],K,f[][],g[][];
ll n;
bool vis[];
inline ll rd(){
ll x=;char c=getchar();bool f=;
while(!isdigit(c)){if(c=='-')f=;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
}
struct node{
int i,j;ll val;
node(int ii=,int jj=,ll v=){i=ii;j=jj;val=v;}
inline bool operator <(const node &b)const{return val<b.val;}
};
priority_queue<node>q;
struct tree{
ll val,la;int l,r,d;
tree(ll xx=,ll yy=,int lx=,int rx=,int dd=){val=xx;la=yy;l=lx;r=rx;d=dd;}
}tr[];
inline int newnode(int x,ll y){
if(!x)return ;
int p=++tot;
tr[p]=tr[x];tr[p].val=tr[p].val*y;tr[p].la=tr[p].la*y;
return p;
}
inline void pushdown(int cnt){
if(tr[cnt].la!=){
tr[cnt].l=newnode(tr[cnt].l,tr[cnt].la);
tr[cnt].r=newnode(tr[cnt].r,tr[cnt].la);
tr[cnt].la=;
}
}
int merge(int x,int y){
if(!x||!y)return x|y;
if(tr[x].val<tr[y].val)swap(x,y);
pushdown(x);
int p=newnode(x,);
tr[p].r=merge(tr[p].r,y);
if(tr[tr[p].l].d<tr[tr[p].r].d)swap(tr[p].l,tr[p].r);
tr[p].d=tr[tr[p].r].d+;
return p;
}
inline void prework(){
int k;
for(int i=;i<=;++i){
if(!vis[i])prime[++prime[]]=i;
for(int j=;j<=prime[]&&(k=i*prime[j])<=;++j){
vis[i*prime[j]]=;
if(i%prime[j]==)break;
}
}
}
int main(){
cin>>n>>K;
prework();
f[][]=g[][]=tot=tr[].val=tr[].la=;
for(int i=;i<=prime[];++i){
f[i][]=g[i][]=;
for(ll pr=prime[i],j=;pr<=n&&pr>;++j,pr=pr*prime[i]){
f[i][j]=;
for(ll prm=prime[i],k=;k<=j;++k,prm=prm*prime[i]){
f[i][j]=merge(f[i][j],newnode(g[i-][j-k],prm));
}
g[i][j]=merge(g[i-][j],f[i][j]);
q.push(node(i,j,tr[f[i][j]].val));
}
}
ll ans=;
while(K--){
node x=q.top();q.pop();
ans=x.val;
pushdown(f[x.i][x.j]);
f[x.i][x.j]=merge(tr[f[x.i][x.j]].l,tr[f[x.i][x.j]].r);
q.push(node(x.i,x.j,tr[f[x.i][x.j]].val));
}
printf("%lld",ans);
return ;
}

[CQOI2016]伪光滑数的更多相关文章

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

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

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

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

  3. [bzoj4524] [loj#2047] [Cqoi2016] 伪光滑数

    Description 若一个大于 \(1\) 的整数 \(M\) 的质因数分解有 \(k\) 项,其最大的质因子为 \(Ak\) ,并且满足 \(Ak^K \leq N\) , \(Ak<12 ...

  4. Bzoj 4524 [Cqoi2016]伪光滑数(堆)

    题面 题解 先筛出$<128$的质数,很少,打个表即可 然后钦定一个质数最大,不断替换即可(丢进大根堆里面,然后取出一个,替换在丢进去即可) 具体来说,设一个四元组$[t,x,y,z]$表示当前 ...

  5. BZOJ4524 CQOI2016伪光滑数(堆)

    对于每个质数求出其作为最大质因子时最多能有几个质因子,开始时将这些ak1~akmaxk扔进堆.考虑构造方案,使得每次取出最大值后,最大质因子.质因子数均与其相同且恰好比它小的数都在堆里.类似暴搜,对于 ...

  6. BZOJ4524 [Cqoi2016]伪光滑数

    BZOJ上的题面很乱,这里有一个题面. 题解: 正解是可持久化可并堆+DP,可惜我不会... 但暴力也可过这道题. 先在不超过N的前提下,在大根堆里加入每个质数的J次方,1<=j, 然后就可以发 ...

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

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

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

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

  9. Loj 2047 伪光滑数

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

随机推荐

  1. Mysql使用event,类似oracle job

    MySQL从5.1开始支持event功能,类似oracle的job功能.有了这个功能之后我们就可以让MySQL自动的执行数据汇总等功能,不用像以前需要操作的支持了.如linux crontab功能. ...

  2. java工作流引擎Jflow父子流程demo

    关键字 驰骋工作流引擎 流程快速开发平台 workflow ccflow jflow  .net开源工作流 定义 一个流程A的一个节点,因工作的需要调起另外的流程B,A就叫父流程,B就叫子流程.如果流 ...

  3. Dynamics 365-关于Activity定制的一个细节

    有一个需求,是Lead上的activity创建的时候,更新regarding Entity上的某个字段信息.需求很简单,写个plugin,注册到对应activity的create事件上,Over... ...

  4. Android studio怎么使用自定义的framework而避免冲突报错和点不进去报红。

    文件:xx\project_abc\video\build.gradle保证可以运行到自定义的framework而不报错,可能因为project和module名字相同所以导致下面的路径是绝对路径,其他 ...

  5. MyDAL - .QueryOneAsync() 使用

    索引: 目录索引 一.API 列表 .QueryOneAsync() .QueryOneAsync<M>() 如: .QueryOneAsync<Agent>() , 用于 单 ...

  6. LAMP动静分离安装(源码安装)

    环境: 版本 IP地址 源码包版本 Centos7.5_mysql 192.168.111.3 mysql-5.7.24.tar.gz,cmake-3.13.1.tar.gz,boost_1_59_0 ...

  7. 在原有数据库中使用 CodeFirst

    一.为当前实体模型启用数据迁移 1.Enable-Migrations -ContextTypeName EME.DBHelper.StoreContext(数据访问上下文) 2. Add-Migra ...

  8. 【记录】使用在线KMS激活win10系统

    摘要 网上一些激活工具可能捆绑了木马.病毒.使用激活工具有风险.使用在线KMS来激活系统则没有这个风险.(自测至发布日期仍然可用) (有能力的请支持正版windows系统) 将kms服务器地址设置为k ...

  9. php分页数据最后一页继续追加第一页数据

    之前做数据分页遇到这样一个需求,就是数据到最后一页的时候不能中断,继续把第一页的数据追加到后面,无限显示下去. 原文地址:代码汇个人博客 http://www.codehui.net/info/23. ...

  10. 在Linux系统安装Nodejs 最简单步骤

    1.去官网下载和自己系统匹配的文件: 英文网址:https://nodejs.org/en/download/ 中文网址:http://nodejs.cn/download/ 通过  uname -a ...