题解 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 ...
随机推荐
- Vue | 路由守卫面试常考
前言 最近在整理基础,欢迎掘友们一起交流学习 结尾有彩蛋哦! Vue Router 路由守卫 导图目录 路由守卫分类 全局路由守卫 单个路由守卫 组件路由守卫 路由守卫执行的完整过程 路由守卫分类 全 ...
- Spring Boot(一):如何使用Spring Boot搭建一个Web应用
Spring Boot Spring Boot 是Spring团队旗下的一款Web 应用框架 其优势可以更快速的搭建一个Web应用 从根本上上来讲 Spring Boot并不是什么新的框架技术 而是在 ...
- Hive——简介
Hive--简介 Hive 是基于 Hadoop 构建的一套数据仓库分析系统,它提供了丰富的 SQL 查询方式来分析存储在 Hadoop 分布式文件系统中的数据, 可以将结构化的数据文件映射为一张数据 ...
- IO编程之对象序列化
对象序列化的目标是将对象保存在磁盘中或者允许在网络中直接传输对象.对象序列化机制循序把内存中的java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上,通过网络将这种二进制流传输 ...
- git的一些常用基础命令
一些常用的git命令操作简单总结 记录常用的git命令,附带命令的简单使用说明 git区域分布 remote远程仓库 repository本地仓库 index暂存区 workspace工作区 stas ...
- C++第三十三篇 -- 研究一下Windows驱动开发(一)内部构造介绍
因为工作原因,需要做一些与网卡有关的测试,其中涉及到了驱动这一块的知识,虽然程序可以运行,但是不搞清楚,心里总是不安,觉得没理解清楚.因此想看一下驱动开发.查了很多资料,看到有人推荐Windows驱动 ...
- Pb代理工具之mitmproxy
mitmproxy 一 . mitmproxy介绍 mitmproxy 就是用于 MITM 的 proxy,MITM 即中间人攻击(Man-in-the-middle attack). 不同于 fid ...
- 【LeetCode】297. 二叉树的序列化与反序列化
297. 二叉树的序列化与反序列化 知识点:二叉树:递归 题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一 ...
- shell常识
1 #!/bin/bash 2 : << ! 3 #使用变量 4 your_name="qinjx" 5 echo $your_name 6 echo ${your_n ...
- 最高级的AutoHotkey重试源代码结构20191221.docx
;; 最高级的AutoHotkey重试源代码结构20191221.docx;; 在编写AutoHotkey脚本时经常要用到重试,; 单击控件无效时需要重新再单击,; 发送模拟按键无效时需要重新发送.; ...