洛谷P2723 丑数 Humble Numbers [2017年 6月计划 数论07]
P2723 丑数 Humble Numbers
题目背景
对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S。这个正整数集合包括,p1、p1*p2、p1*p1、p1*p2*p3...(还有其 它)。该集合被称为S集合的“丑数集合”。注意:我们认为1不是一个丑数。
题目描述
你的工作是对于输入的集合S去寻找“丑数集合”中的第N个“丑数”。所有答案可以用longint(32位整数)存储。
补充:丑数集合中每个数从小到大排列,每个丑数都是素数集合中的数的乘积,第N个“丑数”就是在能由素数集合中的数相乘得来的(包括它本身)第n小的数。
输入输出格式
输入格式:
第 1 行: 二个被空格分开的整数:K 和 N , 1<= K<=100 , 1<= N<=100,000.
第 2 行: K 个被空格分开的整数:集合S的元素
输出格式:
单独的一行,输出对于输入的S的第N个丑数。
输入输出样例
4 19
2 3 5 7
27
说明
题目翻译来自NOCOW。
USACO Training Section 3.1
我居然卡常卡过了!
嗯。。
一个方法是用二叉堆(非手写过不了的)
我们设第i个丑数是num[i]
我们用所有p去乘num[i],把它们压到栈里面。弹出最小数就是num[i + 1]
为了防止重加入的丑数重复需要判断一下
这题因为空间开小了交了很多遍才过
#include <bits/stdc++.h>
inline void read(long long &x){x = 0;char ch = getchar();while(ch > '9' || ch < '0'){ch = getchar();}while(ch >= '0' && ch <= '9')x = x * 10 + ch - '0', ch = getchar();}
inline long long max(long long a, long long b){return a > b ? a : b;}
inline long long min(long long a, long long b){return a > b ? b : a;}
inline void swap(long long &a, long long &b){long long tmp = a;a = b;b = tmp;}
const int INF = 0x3f3f3f3f;
const int MAXN = 100000 + 10;
const int MAXK = 200 + 10; long long p[MAXK],k,n;
long long heap[MAXN << 7];int cnt;
//小根堆
inline int down()//下滤
{
int rank = 1;
while(true)
{
int p;
if((rank << 1) > cnt)break;
if((rank << 1 | 1) > cnt)p = rank << 1;
else
{
if(heap[rank << 1] < heap[rank << 1 | 1])
p = (rank << 1);
else
p = (rank << 1 | 1);
}
if(heap[rank] >= heap[p])
{
swap(heap[rank], heap[p]);
rank = p;
}
else break;
}
}
inline void up(int rank)//上滤
{
while(heap[rank] < heap[rank >> 1] && rank > 1)
{
swap(heap[rank], heap[rank >> 1]);
rank >>= 1;
}
}
inline void insert(long long k)
{
heap[++cnt] = k;
up(cnt);
}
inline void del()
{
swap(heap[1], heap[cnt]);
cnt --;
down();
}
long long ans[MAXN];long long num; int main()
{
read(k);read(n);
for(int i = 1;i <= k;i ++)
{
read(p[i]);
}
heap[++cnt] = 1;
while(num <= n)
{
int tmp = heap[1];del();
if(ans[num] < tmp)
{
ans[++num] = tmp;
for(int i = 1;i <= k;i ++)
{
insert(tmp * p[i]);
}
}
}
printf("%lld", ans[n + 1]);
return 0;
}
另一种解法:
我们要找的ans[i] 要尽可能的接近ans[i - 1]
显然ans[i]是由素数集合p中某一个数与ans[j],j<i的乘积
证明:
令ans[i] = p[k] * M,k为任意数
如果M≠ans[j],则M < ans[j]
那么M一定会被计入到前j个丑数中
矛盾
这样我们定义s[i]表示用素数i乘ans[s[i]]最接近ans[i - 1]的ans下标s[i]
可以得到i - 1时的s[k] 一定 小于等于i时的s[k],k取任意数
所以s[j]可以从i-1过继到i的,然后去递增直到满足 “s[i]表示用素数i乘ans[s[i]]最接近ans[i - 1]的ans下标s[i]”
#include <bits/stdc++.h>
inline void read(long long &x){x = 0;char ch = getchar();while(ch > '9' || ch < '0'){ch = getchar();}while(ch >= '0' && ch <= '9')x = x * 10 + ch - '0', ch = getchar();}
inline long long max(long long a, long long b){return a > b ? a : b;}
inline long long min(long long a, long long b){return a > b ? b : a;}
inline void swap(long long &a, long long &b){long long tmp = a;a = b;b = tmp;}
const long long INF = 0xfffffffffffffff;
const int MAXN = 1000000 + 10;
const int MAXK = 2000 + 10; long long k,n,p[MAXK],ans[MAXN],s[MAXK]; int main()
{
read(k);read(n);
for(int i = 1;i <= k;i ++){
read(p[i]);
}
ans[0] = 1;
for(int i = 1;i <= n;i ++)
{
ans[i] = INF;
for(int j = 1;j <= k;j ++)
{
while(p[j] * ans[s[j]] <= ans[i - 1])s[j] ++;
ans[i] = min(ans[i], p[j] * ans[s[j]]);
}
}
printf("%lld", ans[n]);
return 0;
}
洛谷P2723 丑数 Humble Numbers [2017年 6月计划 数论07]的更多相关文章
- 洛谷P2723 丑数 Humble Numbers
P2723 丑数 Humble Numbers 52通过 138提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目背景 对于一给定的素数 ...
- P2723 丑数 Humble Numbers
题意:给你k个质数,定义丑数集合为k个质数随机(1--k)个相乘得到的数 求第n小的丑数 暴力...貌似不太可行,(把所有大量丑数求出来,sort QAQ) 可以想到,对于第i个丑数f[i],它一 ...
- 洛谷P2826 [USACO08NOV]光开关Light Switching [2017年6月计划 线段树02]
P2826 [USACO08NOV]光开关Light Switching 题目描述 Farmer John tries to keep the cows sharp by letting them p ...
- 洛谷P1757 通天之分组背包 [2017年4月计划 动态规划06]
P1757 通天之分组背包 题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品 ...
- 洛谷P1352 没有上司的舞会 [2017年5月计划 清北学堂51精英班Day3]
P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子 结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职 ...
- Luogu2723丑数Humble Numbers【归并排序】
Luogu2723丑数Humble Numbers 题目背景 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S.这个正整数集合包 ...
- 【转载】丑数humble numbers
转载地址:http://blog.csdn.net/qwerty_xk/article/details/12749961 题:只有2 3 5 这三个因子的数,求第1500个 设1为第一个丑数,求第 ...
- 洛谷P1368 均分纸牌(加强版) [2017年6月计划 数论14]
P1368 均分纸牌(加强版) 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,纸牌总数必为 N 的倍数.可以在任一堆上取1张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取 ...
- 洛谷P1390 公约数的和 [2017年6月计划 数论12]
P1390 公约数的和 题目描述 有一天,TIBBAR和LXL比赛谁先算出1~N这N个数中每任意两个不同的数的最大公约数的和.LXL还在敲一个复杂而冗长的程序,争取能在100s内出解.而TIBBAR则 ...
随机推荐
- pyQT Dialog默认选中某一个选项问题的解决
方法一: 在新建ui文件时不要新建Dialog # -*- coding: utf-8 -*- # Form implementation generated from reading ui file ...
- CSS工程化
CSS工程化 引言: 你在编写CSS代码时,是否遇到过这样的问题: 代码没有层次结构,难以看出嵌套关系 .site-footer .footer-container .footer-menu { di ...
- 19-10-29-Night-X
布谷. 欢迎大家来不耻下问. 这里是正解不会,暴力写跪,乱搞鸡肋的某虻 . 好想放假啊!!!! 话说猫厂现在产量低迷…… ZJ一下: T1,三维偏序,只码了$\Theta(N^2)$暴力 T2,暴力愉 ...
- Bitcoin 的基本原理
昨天读到了 Bitcoin 的中文介绍,觉得非常有意思.不过上面这篇文章解释的非常不靠谱,我花了一晚上去Bitcoin的官方网站 仔细研究了一下,总算理解了其原理.感觉非常有启发,尤其是对虚拟货币的流 ...
- Data too long for column
一篇文章的正文,需要很多字数,默认就是255,不够 @Lob @Basic @Type(type = "text") @Column(name = "detail&quo ...
- topology进程结束会不会关闭数据库连接
测试环境:redhat,oracle 11.2.0.3.0 测试目标:当java进程关闭之后,进程的数据库连接会不会被释放,何时被释放 实验证明:在运行topology前,执行 select coun ...
- C#控件的闪烁问题解决方法总结
最近对代码作了一些优化,试验后效果还可以,但是发现界面会闪烁,具体是TreeView控件会闪烁,语言为C#,IDE为VS2005.在查阅一些资料,使用了一些基本技术后(如开启双缓冲),发现没什么效果. ...
- jsp导出的word默认打开是web视图,希望是页面视图
方法1 ( velocity+java )我也遇到了这个问题,已经解决:1 .<html xmlns:v='urn:schemas-microsoft-com:vml'xmlns:o='urn: ...
- python scikit-learn计算tf-idf词语权重
python的scikit-learn包下有计算tf-idf的api,研究了下做个笔记 1 安装scikit-learn包 sudo pip install scikit-learn 2 中文分 ...
- Hadoop生态系统概况(转)图文并茂说的不错
Hadoop是一个能够对大量数据进行分布式处理的软件框架.具有可靠.高效.可伸缩的特点. Hadoop的核心是HDFS和Mapreduce,hadoop2.0还包括YARN. 下图为hadoop的生态 ...