传送门

咕了蚯蚓这题+前一天被蚊子折腾了半宿没睡=全场几乎就我这题分最低……

发现这里光滑数是不断乘出来的……记得这是一个很经典的套路,然而当时我咕了

  • 求一个每个值都是 \(\{p_i\}\) 中至少一个数的倍数的数列第 \(k\) 项:

    举个例子,求2的所有倍数及3的所有倍数的并集中的第 \(k\) 项

    一大难点在于排序和去重

    然而实际上可以用队列处理,可以免去排序去重的过程

    具体来说,对每个因子维护一个队列,初始只有这个因子本身

    每次从所有队列的首元素中取出最小的那个,这个元素即为数列第 \(i\) 项

    在所有大于等于该元素的因子的队列后加入该元素与这个因子的乘积

    容易发现,这样保证了所有可能性都一定出现过,且无重

    我们把一个可能性表示为 \(\prod p_i\) ,则 \(i\) 一定单调不降

    则每个可能性都可以唯一表示,所以无重

    假设一个 \(x\) 被漏掉了,那么 \(\frac{x}{p_{max\{i\}}}\) 也一定被漏掉了,类推得队列中初始为空

    由于所选元素单增,每个队列对应因子不变,所以队列中元素大小也单增

于是就是板子了

Code:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 10000010
#define ll long long
//#define int long long char buf[1<<21], *p1=buf, *p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
inline ll read() {
ll ans=0, f=1; char c=getchar();
while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
return ans*f;
} int b, k; namespace table{
bool vis[N];
int pri[N], cnt;
void init() {
for (int i=2; i<=100; ++i) {
if (!vis[i]) pri[++cnt]=i;
for (int j=2; j<=100&&i*j<=1000; ++j)
vis[i*j]=1;
}
for (int i=1; i<=cnt; ++i) cout<<pri[i]<<' '; cout<<endl;
}
void solve() {
init();
}
} namespace force{
int pri[N], pcnt;
bool npri[N], vis[N];
void solve() {
npri[0]=npri[1]=1;
int lim=1e7;
for (int i=2; i<=lim; ++i) {
if (!npri[i]) pri[++pcnt]=i;
for (int j=1; j<=pcnt&&i*pri[j]<=lim; ++j) {
npri[i*pri[j]]=1;
if (!(i%pri[j])) break;
}
}
for (int i=b+1; i<=pcnt; ++i)
for (int j=1; pri[i]*j<=lim; ++j)
vis[pri[i]*j]=1;
int cnt=0;
for (int i=1; i<=lim; ++i) {
if (!vis[i]) {
//cout<<i<<' ';
if (++cnt==k) {
//cout<<endl;
printf("%d\n", i);
exit(0);
}
}
}
}
} namespace task1{
ll qpow(ll a, ll b) {
ll ans=1;
while (b) {
if (b&1) ans=(ans*a);
a=a*a; b>>=1;
}
return ans;
}
void solve() {
if (k==1) puts("1");
else printf("%lld\n", qpow(2, k-1));
exit(0);
}
} namespace task2{
ll sta[N], top;
void solve() {
ll a=1, b;
for (int i=1; i<int(1e6); ++i) {
if (a*3ll<0) break;
//cout<<"upd2: "<<a<<endl;
b=1;
for (int j=1; b>0&&a*b>0&&a*b<(ll)(1e18)&&b<int(1e6); ++j) {
//cout<<"upd3: "<<a<<' '<<b<<endl;
sta[++top]=a*b;
b*=3ll;
}
a*=2ll; if (a<0) break;
}
sort(sta+1, sta+top+1);
//for (int i=1; i<=top; ++i) cout<<sta[i]<<' '; cout<<endl;
printf("%lld\n", sta[k]);
exit(0);
}
} namespace task{
queue<ll> q[20];
ll pri[]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};
void solve() {
for (int i=1; i<=b; ++i) q[i].push(pri[i]);
ll minn;
for (int i=1,mini; i<=k-1; ++i) {
minn=(ll)(1e18);
for (int j=1; j<=b; ++j)
if (q[j].front()<minn)
minn=q[j].front(), mini=j;
q[mini].pop();
for (int j=mini; j<=b; ++j)
q[j].push(minn*pri[j]);
}
printf("%lld\n", minn);
exit(0);
}
} signed main()
{
b=read(); k=read();
//if (b==1) task1::solve();
//else if (b==2) task2::solve();
//else force::solve();
task::solve(); return 0;
}

题解 Smooth的更多相关文章

  1. 「题解」:$Smooth$

    问题 A: Smooth 时间限制: 1 Sec  内存限制: 512 MB 题面 题面谢绝公开. 题解 维护一个队列,开15个指针,对应前15个素数. 对于每一次添加数字,暴扫15个指针,将指针对应 ...

  2. 8.7考试总结(NOIP模拟)[Smooth·Six·Walker]

    前言 踩了挺多以前没踩过的坑... T1 一开始是打了一个 60pts 的 DFS ,在与暴力拍了几组数据保证正确性之后, 突然想到 BFS 可能会更快一些,然后就又码了一个 BFS,又和 DFS 拍 ...

  3. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  4. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  5. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  6. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  7. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  8. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  9. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

随机推荐

  1. 职场人都该了解<荷花定律>

    先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员.我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验. 荷花定律 ,听起来很新奇的一个 ...

  2. Jmeter之代理元件&代理配置

    一 jmeter代理服务器添加及网页代理配置 1.1 打开jmeter,添加代理HTTP代理服务器,再添加一个线程组,放在代理服务器的下面. 1.2 代理服务器设置 端口默认8888,目标控制器选择t ...

  3. Vue3 + Cesium + Typescript 集成搭建的快速启动模板(包含示例数据)

    开门见山 项目地址:https://github.com/tanghaojie/vue3-cesium-typescript-start-up-template 好用的话给个star呗,有更新可以第一 ...

  4. Adaptive AUTOSAR 学习笔记 4 - 架构

    本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20-11 版本 AUTOSAR_EXP_PlatformDesign.pdf 缩写 AP:AUTOSAR Adap ...

  5. Linux常用命令 day day up系列2

    一.alias--设置别名二.du--统计目录及文件空间占用情况三.mkdir--创建新目录四.touch--创建空文件五.ln--创建链接文件1.链接文件类型六.cp--复制文件或目录七.rm--删 ...

  6. Spring总结之IOC

    一.Spring IOC 简介 IOC(Inverse of control):控制反转,又称作依赖注入,主要是把创建对象和查找依赖对象的控制权交给IOC容器,由IOC容器管理对象的生命周期,是一种重 ...

  7. bootstrap栅格布局-v客学院知识分享

    今天主要跟大家讲解下bootstrap的栅格布局,以及使用过程中应该注意的问题 首先我们要使用bootstrp的栅格布局就必须使用HTML正确的基本结构 如下图: 必须给要使用栅格布局的盒子定义cla ...

  8. 安装Go语言支持及Gogs版本管理工具

    安装Go语言支持及Gogs版本管理工具 1. GO 语言: 1.1 介绍 1.1.1 官方介绍: The Go programming language is an open source proje ...

  9. ubuntu16.04细节设置

    1.查看无线网卡名称 $ iwconfig ------------------ lo no wireless extensions. eth1 no wireless extensions. eth ...

  10. Linux 查看内存命令

    Linux 查看内存命令 top命令, Linux的top命令提供Linux资源使用情况的实时更新信息.不仅可以查看Linux内存,也可以查看CPU以及各个进程之间的对资源的占用情况.使用方式如下: ...