Description

若一个大于 \(1\) 的整数 \(M\) 的质因数分解有 \(k\) 项,其最大的质因子为 \(Ak\) ,并且满足 \(Ak^K \leq N\) , \(Ak<128\) ,我们就称整数 \(M\) 为 \(N-\) 伪光滑数。现在给出 \(N\) ,求所有整数中,第 \(K\) 大的 \(N-\) 伪光滑数。

Input

只有一行,为用空格隔开的整数 \(N\) 和 \(K\)

\(2 \leq N \leq 10^18\) ,\(1 \leq K \leq 800000\),保证至少有 \(K\) 个满足要求的数

Output

只有一行,为一个整数,表示答案。

Sample Input

12345 20

Sample Output

9167


想法

目前见到的求 第 \(K\) 大/小的题大概有三种做法:

1.二分判断。

2.在 \(K\) 不太大时,可以从大到小/从小到大枚举,用数据结构维护当前最大,取出最大值后用次大值(扩展值)代替它。

3.堆的 \(K\) 路归并(我也不懂这是啥 %%%标算

这道题中我用的是第二种做法。

首先一个性质,对于数 \(i\) ,\(i \leq Ak^k \leq N\) ,假设 \(Ak^k\) 为 \(i\) 的“特征数”

由于 \(Ak \leq 128\) , 而128以内的质数仅31个,所以 \(N\) 以内的特征数值很少

所以大体想法就是优先队列维护所有的“特征数”对应的 \(i\) 的最大值,每次取出最大,用次大替代就行了。

初始状态时每个特征数对应的最大值很好搞,就是 \(Ak^k\) (特征数本身的值)

但次大是多少呢? \(Good\) \(Question!\)

我发现次大有两种情况,一种把一个 \(Ak\) 换为 \(A_{k-1}\),一种是将某一个 \(Ax\) 换为 \(A_{x-1}\)

有点乱。

试着搞出一种扩展顺序,即“分层扩展”。

初始状态,某个特征数 \(Ak^k\) 对应的最大值是 \(k\) 个 \(Ak\) 相乘,不妨称它的层数为0

在扩展 \(Ak^k\) 时,取出一个 \(Ak\) ,换成 \(A1,A2,...,A_{k-1}\) ,即 \(Ak^{k-1} \times Ax\) ,称它们的层数为1(替换了一个 \(Ak\))

在扩展 \(AK^{k-1} \times Ax\) 时,再取出一个 \(Ak\) ,换成 \(A1,A2,...,Ax\) ,即 \(Ak^{k-2} \times Ax \times Ay\) ,称它们的层数为2(替换了两个 \(Ak\))

以此类推……

注意到每次扩展时,\(Ay \leq Ax\) ,这是为了防止同一个数,由于被换的顺序不同而被计算多次。

这样可以保证每次扩展后,该特征数的次大值都在优先队列中嘛?(注意,是“在优先队列中”,但不一定是这次扩展加进去的)

首先,显然每个数扩展出的数都比它本身小,所以对于所有可以通过这种方法扩展出、但没加到优先队列中的数,一定说明扩展出它的数没加到优先队列中或在队列中还没成为最大值,即这些数不是我要的“次大值”

而是不是所有数都可以通过这种方法扩展出呢?显然可以!

其实这就是模拟搜索吧。。。复杂度 \(O(128K)\) 可以卡过。


一些启示

\(Orz\)

分层扩展……?

要有一些顺序的思想吧,不必每次只扩展一个……?

【我也不知道哭唧唧】


代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<vector> using namespace std; typedef long long ll; ll n;
int k;
int p[31]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127}; struct data{
ll t;
int x,y,z; // p[x]^y,nxtmin--p[z]
data() { t=0; x=y=z=0; }
data(ll a,int b,int c,int d) { t=a; x=b; y=c; z=d; }
bool operator < (const data &b) const{ return t<b.t; }
};
priority_queue<data> q; int main()
{
scanf("%lld%d",&n,&k); ll x;
for(int i=0;i<31;i++){
x=1;
for(int j=1;1ll*x*p[i]<=n;j++){
x*=p[i];
q.push(data(x,i,j,i-1));
}
} data tmp;
while(k--){
tmp=q.top(); q.pop();
if(tmp.y>1){
for(int i=tmp.z;i>=0;i--)
q.push(data(tmp.t/p[tmp.x]*p[i],tmp.x,tmp.y-1,i));
}
}
printf("%lld\n",tmp.t); return 0;
}

[bzoj4524] [loj#2047] [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. [CQOI2016]伪光滑数

    题目描述 若一个大于1的整数M的质因数分解有k项,其最大的质因子为Ak,并且满足Ak^K<=N,Ak<128,我们就称整数M为N-伪 光滑数.现在给出N,求所有整数中,第K大的N-伪光滑数 ...

  4. BZOJ4524 CQOI2016伪光滑数(堆)

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

  5. BZOJ4524 [Cqoi2016]伪光滑数

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

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

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

  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. computed计算属性(二)

    一.说明 在computed中,可以定义一些属性,即计算属性. 计算属性本质是方法,只是在使用这些计算属性的时候,把他们的名称直接当作属性来使用,并不会把计算属性当作方法去调用,不需要加小括号()调用 ...

  2. 为何D3D11的几个矩阵需要转置?

    在学习D3D11的时候遇到一个问题,事情是这样的: D3D11引入了常量缓存(const buffer)用来实现数据的高速传输,这块儿buffer是CPU Only Write,GPU Only Re ...

  3. Team Foundation Server 2015使用教程【1】:团队项目创建

  4. 三句话说清楚ssh端口转发

    看了下自己以前的笔记发现也没有完全搞清楚, 网上好多文章都是抄来抄去,远程端口转发全都是拿127.0.0.1举例 总结了下,三句话就可以讲清楚了   1 ssh本地端口转发是 把ssh服务器可以访问到 ...

  5. SofaBoot使用Nacos进行服务注册发现

    前提 最近创业公司的项目组基于业务需要,开发一套新的微服务,考虑到选用的组件必须是主流.社区活跃.生态完善以及方便迁移到云上等因素,引入了SOFAStack全家桶.微服务开发里面,一个很重要的功能就是 ...

  6. 开发者请注意:Python2 的最后版本将于 4 月发布,但它确实是在 1 月 1 日就寿命终止了!

    2020 年 1 月 1 日是 Python2 的寿命终止日,这个日期在两年前经"Python之父" Guido van Rossum 宣布,此后一直成为开发者社区翘首以盼的一天. ...

  7. xshell连接不上ubuntu---could not connect to 'ip' (port 22): Connection failed.

    可能是没有开启ssh server,接下来就是开启服务就好.命令如下: sudo apt-get install openssh-server 这样就OK啦

  8. Qt Quick QMl学习笔记 之图片浏览器

    Qt Quick模块是编写QML应用程序的标准库.虽然Qt QML模块提供QML引擎和语言基础结构,但Qt Quick模块提供了使用QML创建用户界面所需的所有基本类型.它提供了一个可视画布,包括用于 ...

  9. $splay$学习总结$QwQ$

    省选之前就大概搞了下$splay$,然后因为时间不太够就没写总结了,,,然后太久没用之后现在一回想感觉跟没学过一样了嘤嘤嘤 所以写个简陋的总结,,,肥肠简陋,只适合$gql$复习用,不建议学习用 然后 ...

  10. javascript数组大全(一张图列出数组的所有方法)

    把所有数组的方法列在了一张图上,为了自己温故一下,也为了以后忘记时好查阅. 如果大家在上面查阅方法,可以找到对应的方法名,看前面简单的注释,还是不能明白的话,可以看一下官网说明,地址给大家列出来,MD ...