题目传送门(内部题11)


输入格式

第一行,三个整数$T,K,M$,分别代表数据组数、良好标准和整数范围。
接下来$T$行,每行一个整数$n_i$,代表一个询问。


输出格式

输出$T$行,在第$i$行对于询问$i$输出一个整数,代表第$n_i$个良好的整数。
保证答案一定不超过给定的$M$。


样例

样例输入1:

1 0 23333
10

样例输出1:

20

样例输入2:

3 5 998244353
28
165
233

样例输出2:

42
9360
63360


数据范围与提示

样例1解释:

前$10$个优秀的整数是$1,2,3,4,6,8,10,12,18,20$。

数据范围:

对于所有数据,$1\leqslant T\leqslant 20,0\leqslant K\leqslant 233,1\leqslant n_i\leqslant M\leqslant {10}^{18}。


题解

对于一个质数$p$,我们考虑所有仅包含小于$p$的质因子的正整数集$G$。不难发现:
  若$x\in G$,且在$G$中已经有超过$K$个小于$x$的整数约数个数多于$x$,即$x$一定不是良好的,则$xp^c(c\geqslant 0)$也一定不可能是良好的。
这样我们就可以得到一个初步的想法。开始我们认为仅有$1$是良好的,枚举质因子$p$,对于每一个原来认为是良好的数$x$,将$xp^c(c\geqslant 0)$加入候选列表,接着将候选列表排序,除去已经可以确定不是良好的数,进入下一轮迭代。容易证明,在这个算法中,筛去一个不是良好的数$x$,是不会在后续过程中令一个原本不是良好的数,变成一个良好的数的,故筛去良好的数的过程是合法的剪枝。
然而枚举的质因子的范围有多大呢?联想$K=0$这一经典问题,我们知道对于${10}^{18}$的范围,考虑前$20$个质因子都绰绰有余了,因为将更大的质因子加入是非常不优的。在$K$更大的时候,我们采用“迭代至稳定”的思想,每一轮迭代后检查答案是否变化,如果在较长一段迭代后答案无任何变化,我们就认为质因子$p$的上界已经达到。经过实践,在$K=233$时,$p$的最大值取到$293$即可。
我们考虑如何在一轮迭代中除去确定不是良好的数。考虑维护前$K+1$大值,从小到大枚举候选列表中的数$x$,若$x$小于第$K+1$大值,我们就把这个数除去。否则更新前$K+1$大值。根据上述描述可以大致估算复杂度。设$K=233$时,${10}^{18}$内良好的数的数量为$N$,经过实践,可以知道$N$约为$50,000$。每次扩展最多把一个数扩展成$\log M$个数,在剪枝完毕后,列表大小又回归到$N$以下。

时间复杂度:$\Theta((N\times K\times \max(p)\log M)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int T,K;
long long M;
int prime[]={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,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293};
int cnt,num,size;
pair<int,long long> heap[200000],que[200000],flag[200000];
bool cmp(pair<int,long long> x,pair<int,long long> y){return x.second==y.second?x.first<y.first:x.second<y.second;}
void up(int x)
{
while(x>1)
if(heap[x]<heap[x>>1])
{
swap(heap[x],heap[x>>1]);
x>>=1;
}
else break;
}
void insert(pair<int,long long> x){heap[++size]=x;up(size);}
void down(int x)
{
int s=x<<1;
while(s<=size)
{
if(s<size&&heap[s]>heap[s|1])s|=1;
if(heap[s]<heap[x])
{
swap(heap[s],heap[x]);
x=s;
s=x<<1;
}
else break;
}
}
void change(pair<int,long long> x){heap[1]=x;down(1);}
int main()
{
scanf("%d%d%lld",&T,&K,&M);
que[++cnt]=make_pair(1,1);
for(int i=0;i<62;i++)
{
num=0;
long long lft=0,rht=M/prime[i],k=0;
while(lft<=rht)
{
lft=max(lft*prime[i],1LL);
k++;
for(int j=1;j<=cnt&&lft*que[j].second<=M;j++)
flag[++num]=make_pair(que[j].first*k,lft*que[j].second);
}
sort(flag+1,flag+num+1,cmp);
int lst=cnt;
cnt=size=0;
for(int j=1;j<=min(K+1,num);j++)
{
insert(flag[j]);
que[++cnt]=flag[j];
}
for(int j=min(K+1,num)+1;j<=num;j++)
if(flag[j].first>=heap[1].first)
{
change(flag[j]);
que[++cnt]=flag[j];
}
if(lst==cnt)break;
}
while(T--)
{
int x;
scanf("%d",&x);
printf("%lld\n",que[x].second);
}
return 0;
}

rp++

[CSP-S模拟测试]:数论(数学)的更多相关文章

  1. [考试反思]0729NOIP模拟测试10

    安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...

  2. 0823NOIP模拟测试赛后总结

    考了两场感觉虚了... NOIP模拟测试30 分着考的. 就只有T2的美妙的暴力拿分了,60分rank10,挂了. T1是一道sb题,爆零了十分遗憾. 许多人都掉进了输出格式的坑里,C没大写.少个空格 ...

  3. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  4. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

  5. 安装nginx python uwsgi环境 以及模拟测试

    uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...

  6. 【模拟】【数学】CSU 1803 2016 (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1803 题目大意: 给定n,m(n,m<=109)1<=i<=n,1& ...

  7. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  8. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

  9. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

随机推荐

  1. Haddop的数据计算部分原理

    import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import o ...

  2. rac节点挂掉后,vip飘到别的节点,但是业务连接不上报 no listener问题处理

    客户一套rac系统,三节点,其中一个节点的p260主机主板有问题(经常机器重启,好像是这个型号的通病,主板被炒到20W),临时把故障节点的vip作为业务地址用. 首先,查看确定故障节点vip飘到那个节 ...

  3. debian下重装mysql

    mysql总是报错,说sock文件不存在,网上若干方法,更改权限,更改配置文件,结果还是不能正常生成.sock文件.没办法,删除,重新安装. 完全删除: 删除 mysqlsudo apt-get au ...

  4. Android之异步调用

    概述 AsyncTask可以很好的,准确的使用UI线程,他可以将一个比较耗时(几秒钟)的动作运行在后台,并且能将结果返回至UI线程中,不需要通过(Thread操作和Handler操作). 使用时必须通 ...

  5. python字典使用总结

    作者:python技术人 博客:https://www.cnblogs.com/lpdeboke 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 ...

  6. 【洛谷p1981】表达式求值

    题前废话: 咱也不知道咱写了个什么神奇的代码导致_rqy都看不明白它是怎么re掉的, 代码的大致思路是这样的:对于这样一个中缀表达式,先转化成它的后缀表达式的形式,然后利用P1449 后缀表达式 这道 ...

  7. [BZOJ 2989]数列(二进制分组+主席树)

    [BZOJ 2989]数列(二进制分组+主席树) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[ ...

  8. [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)

    [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...

  9. docker pull使用 代理

    [root@fdfs- ~]# cat /usr/lib/systemd/system/docker.service [Unit] Description=Docker Application Con ...

  10. Git:将本地项目连接到远程(github、gitee、gitlab)仓库流程

    当进行协同开发或者为了代码安全备份需要,一般都会将本地代码和远程仓库相连接. 备注:Github.Gitee.Gitlab是三个常用的远程git仓库,操作流程基本一致. 提前环境要求: 1.node. ...