题目描述

若一个大于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. Java 工厂模式(一)— 工厂方法(Factory Method)模式

    一.工厂方法(Factory Method)模式: 1.什么是工厂方法模式? 工厂方法模式是类的创建型模式,又叫做虚拟构造子模式或者多态工厂模式.它的意义是创建产品对象的工厂接口,将实际创建工作推迟到 ...

  2. H5与C3权威指南笔记--box-shadow

    box-shadow 用于给盒子添加阴影效果.IE9+ 举个栗子:box-shadow: inset 5px 5px 5px red; inset可选,该值会让阴影出现在盒子内部. 第一个5px是阴影 ...

  3. Android视频录制从不入门到入门系列教程(三)————视频方向

    运行Android视频录制从不入门到入门系列教程(二)————显示视频图像中的Demo后,我们应该能发现视频的方向是错误的. 由于Android中,Camera给我们的视频图片的原始方向是下图这个样子 ...

  4. Android探究之ANR

    什么是ANR ANR:Application Not Responding,即应用程序无响应. 在Android中,ActivityManagerService(简称AMS)和WindowManage ...

  5. python高级(4)—— 虚拟环境安装使用

    虚拟环境 什么是虚拟环境 对电脑稍微有点常识的朋友相信都玩过,比如VMware,virtualbox,或者你用电脑端的模拟器玩手机端的游戏也是一样,其实就是一个假的空间,在Python这里,虚拟环境就 ...

  6. 创建一个Windows服务程序与实现定时器效果

    1.创建一个Windows服务程序 一.   新建Window服务项目 二.   添加安装程序 三.   配置服务属性 四.   编写定时器代码 publicpartialclassService1 ...

  7. 【心得】Lattice和Xilinx工具关键特性对比(Diamond、ISE)

    [博客导航] [导航]FPGA相关 背景 由于项目需要,初次接触Diamond,发现跟之前的ISE有很多不同,记录下一些体会,供参考.按开发流程,将一些常用的特性进行对比,列举如下: IP Core管 ...

  8. 好的RESTful API的设计原则

    转载自一位大佬 英文原版 Principles of good RESTful API Design Good API design is hard! An API represents a cont ...

  9. 记一次在咸鱼上购买 MacBook Pro 的经历

    前言 以前一直用的是 windows 的,但是最近特别想买个 macOS 的.其实不是为了其他什么目的,只是涉及到开发 macOS更接近 linux 系统,一直没使用过所以就想尝试体验下,而且现在很多 ...

  10. Linux下的crontab

    Ubuntu服务器/var/log下没有cron日志,这里记录一下如何ubuntu server如何查看crontab日志 crontab记录日志 修改rsyslog sudo vim /etc/rs ...