题解 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 ...
随机推荐
- Leetcode No.121 Best Time to Buy and Sell Stock(c++实现)
1. 题目 1.1 英文题目 You are given an array prices where prices[i] is the price of a given stock on the it ...
- Ajax爬取动态数据和HTTPS自动默认证书
Ajax数据爬取 在spider爬取数据的过程中,有些网页的数据是利用Ajax动态加载出来的,所以,在网页源代码中可能不会看到这一部分的数据,因此,我们需要使用另外的方式进行数据多爬取. 以豆瓣电影的 ...
- python之数据驱动Excel操作(方法一)
一.Mail163.xlsx数据如下: 二.Mail163.py脚本如下 import xlrdimport unittestfrom selenium import webdriverfrom se ...
- python -- 程序异常与调试(程序调试)
一.程序调试 A.使用assert语句检测程序代码中的错误. assert 表达式[, 参数] 如果表达式为True,则继续往下运行:如果为False,则抛出一个AssertionError异常,并且 ...
- Python中调用Java程序包
<原创不易,转载请标明出处:https://www.cnblogs.com/bandaobudaoweng/p/10785766.html> 开发Python程序,需求中需要用到Java代 ...
- python中的abstractmethod
# -*- coding: utf-8 -*- from abc import ABC ,abstractclassmethod from collections import namedtuple ...
- 论文笔记:(NIPS2018)PointCNN: Convolution On X-Transformed Points
目录 摘要 一.2D卷积应用在点云上存在的问题 二.解决的方法 2.1 idea 2.2 X-conv算子 2.3 分层卷积 三.实验 3.1分类和分割 3.2消融实验.可视化和模型复杂度 总结 仍存 ...
- Docker与k8s的恩怨情仇(七)—— “服务发现”大法让你的内外交互原地起飞
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 第一章:Docker与k8s的恩怨情仇(一)-成为PaaS前浪的Cloud Foundry 第二章:Dock ...
- 承载童年的游戏机,已停产!但我在 GitHub 找到了它们
那些年,上网用的是电话线,小企鹅也只会笨拙地左右摇晃,手机还只是打电话的工具.虽然那些年没有互联网,但游戏机承载了我的童年. 小时候我老是追着我的两个哥哥,他们带我玩了好多种游戏机,比如街机.红白机. ...
- Go语言笔记[实现一个Web框架实战]——EzWeb框架(一)
Go语言笔记[实现一个Web框架实战]--EzWeb框架(一) 一.Golang中的net/http标准库如何处理一个请求 func main() { http.HandleFunc("/& ...