题解 Smooth
咕了蚯蚓这题+前一天被蚊子折腾了半宿没睡=全场几乎就我这题分最低……
发现这里光滑数是不断乘出来的……记得这是一个很经典的套路,然而当时我咕了
- 求一个每个值都是 \(\{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的更多相关文章
- 「题解」:$Smooth$
问题 A: Smooth 时间限制: 1 Sec 内存限制: 512 MB 题面 题面谢绝公开. 题解 维护一个队列,开15个指针,对应前15个素数. 对于每一次添加数字,暴扫15个指针,将指针对应 ...
- 8.7考试总结(NOIP模拟)[Smooth·Six·Walker]
前言 踩了挺多以前没踩过的坑... T1 一开始是打了一个 60pts 的 DFS ,在与暴力拍了几组数据保证正确性之后, 突然想到 BFS 可能会更快一些,然后就又码了一个 BFS,又和 DFS 拍 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
随机推荐
- MindSpore模型精度调优实战:常用的定位精度调试调优思路
摘要:在模型的开发过程中,精度达不到预期常常让人头疼.为了帮助用户解决模型调试调优的问题,我们为MindSpore量身定做了可视化调试调优组件:MindInsight. 本文分享自华为云社区<技 ...
- ESP32智能配网笔记
基于ESP-IDF4.1 #include <string.h> #include <stdlib.h> #include "freertos/FreeRTOS.h& ...
- Java | this的本质 和 static的本质
this 在说this之前先说一下,对象创建的过程: 1.分配对象空间,并将对象成员变量初始化. 2.执行属性值的显式初始化. 3.执行构造方法. 4.返回相关的地址给相关的对象. this的本质 ...
- python 15篇 面向对象
1.面向对象编程概念 面向对象是包含面向过程 面向过程编程 买车: 1.4s看车,买车 2.上保险 保险公司 3.交税 地税局 4.交管所 上牌面向对象编程 卖车处: 1.4s 2.保险 3.交税 4 ...
- flex布局制作自适应网页
网页布局是css的一个重点应用.传统的布局都是依赖display.position.float属性来实现的,但是特殊布局就不易实现,如垂直居中. 01 flex布局是什么? Flex 是 Flexi ...
- Swift-使用transform 实现重复平移动画
摘要 要实现一组重复的动画,本质上就是找到动画开始点.结束点.在动画结束的时候,触发开始点,持续这样的动作. 这里面要梳理的逻辑就是1.触发开始点和2.监听动画结束点.这两个逻辑是实现重复动画的基础. ...
- Spark—RDD编程常用转换算子代码实例
Spark-RDD编程常用转换算子代码实例 Spark rdd 常用 Transformation 实例: 1.def map[U: ClassTag](f: T => U): RDD[U] ...
- 前端之html基础演示
1.本地服务:下载淘宝镜像node.js :https://npm.taobao.org/mirrors/npm :本次下载的版本是 v10.0.0 2.下载成功后,到cmd窗口输入 node -v, ...
- AT2304 Cleaning
AT2304 Cleaning 题意 一个树上每个节点有一些石子,每次只能选取两个叶子节点并将路径间的所有点上的石子数量减1,问是否能将所有石子取完. 思路 设 \(f_x\) 表示从 \(x\) 节 ...
- [考试总结]noip模拟15
这次不咕了. 首先发现这套题目十分毒瘤, \(T1\) 就没有太大的思路. 结果最后也是暴力收场... 菜. \(T1\;60pts\) 暴力居然还是挺高的,\(T2\) 莽了一个随机化上去结果还是暴 ...