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. PHP性能监控

    使用xhprof进行线上PHP性能追踪及分析 日志未经声明,均为AlloVince原创.版权采用『 知识共享署名-非商业性使用 2.5 许可协议』进行许可. 之前一直使用基于Xdebug进行PHP的性 ...

  2. SpringBoot的四种定时任务

    定时任务实现的几种方式: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务. 使用这种方式可以让你的程序按照某一个频度执行 ...

  3. 2018-5-19-创建不带BOM-的UTF8

    title author date CreateTime categories 创建不带BOM 的UTF8 lindexi 2018-05-19 14:11:33 +0800 2018-2-13 17 ...

  4. 2018-8-10-win10-uwp-进度条-WaveProgressControl

    title author date CreateTime categories win10 uwp 进度条 WaveProgressControl lindexi 2018-08-10 19:16:5 ...

  5. QP移植

    以STM32平台为例,该单片机的ARM Cortex-M系列内核正是被QP长期支持,所以QP在ARM Cortex-M系列内核上已经有长时间的应用验证. 在配套书籍PSICC2中的例程为QP最原始的版 ...

  6. UVW平台运动控制算法以及matlab仿真

    UVW平台运动控制算法以及matlab仿真   最近公司同事因为对某视觉对位平台的运动控制算法有疑问,所以来请教我.由于我也是第一次接触到UVW自动对位平台(也可以叫XXY自动对位平台),于是找了一些 ...

  7. webhook功能概述

    1.什么是webhook? webhooks是一个api概念,是微服务api的使用范式之一,也被成为反向api,即:前端不主动发送请求,完全由后端推送. 举个常用例子,比如你的好友发了一条朋友圈,后端 ...

  8. 从零开始のcocos2dx生活(二)Node

    节点 Node 文章目录 节点 Node 前言 变量初始化 创建一个节点对象 获取节点依赖的计数器 获取节点的描述(获取节点的Tag) 节点的局部层顺序值(LocalZOrder) 设置节点的Loca ...

  9. 【瞎讲】 Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18)

    [背诵瞎讲] Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18) 看CSP看到一题"线性递推式",不会做,去问了问zsy怎么做,他并 ...

  10. 异常记录 Connection reset

    连接重置Connection reset 异常java.net.SocketException: Connection reset 详细信息 java.net.SocketException: Con ...