传送门

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

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

  • 求一个每个值都是 \(\{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. Qt绘图浅析与实例

    1. Qt5位置相关函数 Q提供了很多关于获取窗体位置及显示区域大小的函数,如x().y()和pos().rect().size().geometry()等,统称为"位置相关函数" ...

  2. CDN相关知识及CDN绕过

    #什么是CDN? 内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络.CDN应用广泛,支持多种行业 ...

  3. "Shortest" pair of paths[题解]

    "Shortest" pair of paths 题目大意 给出 \(n\) 个点,\(m\) 条边,除第一个点和最后一个点外,其他所有的点都只能被经过一次,要求找到两条从第一个点 ...

  4. WIN10技巧

    1.快速打开"开始---自动启动"文件夹:开始--支行--shell:startup 2

  5. Scala学习——集合

    Scala集合 一.数组 package top.ruandb.scala.Course04 object ArrayApp { def main(args: Array[String]): Unit ...

  6. MapReduce学习总结之Combiner、Partitioner、Jobhistory

    一.Combiner 在MapReduce编程模型中,在Mapper和Reducer之间有一个非常重要的组件,主要用于解决MR性能瓶颈问题 combiner其实属于优化方案,由于带宽限制,应该尽量ma ...

  7. 前端开发入门到进阶第四集【使用sublime安装jshint和cssLint】

    参考:https://blog.csdn.net/qq_27965129/article/details/52786224 使用sublime安装JSHint插件: 1,解决不能使用package c ...

  8. 在Vue中echarts可视化组件的使用

    echarts组件官网地址:https://echarts.apache.org/examples/zh/index.html 1.找到脚手架项目所在地址,执行cnpm install echarts ...

  9. synchronized锁机制(六)

    前言 1.理解同步关键词synchronized 2.同步方法与同步代码块的区别 3.理解锁的对象this 脏读 一个常见的概念.在多线程中,难免会出现在多个线程中对同一个对象的实例变量进行并发访问的 ...

  10. Python自动化测试面试题-Linux篇

    目录 Python自动化测试面试题-经验篇 Python自动化测试面试题-用例设计篇 Python自动化测试面试题-Linux篇 Python自动化测试面试题-MySQL篇 Python自动化测试面试 ...