题目描述

若一个大于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. c# 构造tree下拉框,空格转化

    c#代码写的空格如何在html中的select中展示出来呢? var str = ""; //父级菜单不缩进 ; j < i; j++) { str += HttpUtili ...

  2. 从QA到工程能效团队

    Engineering Productivity Productivity is our job; testing and quality are the job of everyone involv ...

  3. 学JAVA第十八天,接口与抽象类进一步加深

    昨天老师讲了建网站,还要交钱买东西的,所以就没写,今天讲了接口与抽象类进一步加深 上完今天的课后,我才知道一个接口可以有多个实现类,一个实现类可以同时接多个接口. 现在就用代码来解释吧!!! 举例用人 ...

  4. javascript原型与原型链,prototype、__proto__、constructor

    javascript通过构造函数(constructor)和原型链来(prototype chain)实现其他面向对象语言的类概念.ES6语法中引入了“类”(class)的概念,但只是一个语法糖,只是 ...

  5. 微信分享大图遇到的问题(Android)

    起因: 要做一个微信图片分享的功能,但是对于大图会如下问题: 当时没有仔细查看错误日志,单纯的以为是图片太大的问题. 分享图片代码: public void WXsharePic(String tra ...

  6. Android Material Design控件使用(一)——ConstraintLayout 约束布局

    参考文章: 约束布局ConstraintLayout看这一篇就够了 ConstraintLayout - 属性篇 介绍 Android ConstraintLayout是谷歌推出替代PrecentLa ...

  7. Handler,Looper,MessageQueue流程梳理

    目的:handle的出现主要是为了解决线程间通讯. 举个例子,android是不允许在主线程中访问网络,因为这样会阻塞主线程,影响性能,所以访问网络都是放在子线程中执行,对于网络返回的结果则需要显示在 ...

  8. 安装CentOs 7.3

    步 下载安装 CentOS 7.3  下载地址 1.官网:https://www.centos.org/download/ 2.centos阿里汇总:https://yq.aliyun.com/zt/ ...

  9. hbase 工作原理

    一.HBASE介绍HBase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建大规模结构化的存储集群.HBase的目标是存储并处理大型数据,具体 ...

  10. JDBC实现简单增删改查

    JDBC全称为:Java Data Base Connectivity (java数据库连接),主要用于java与数据库的链接. 整个链接过程如下图: 1.数据库驱动:Driver 加载mysql驱动 ...