18005 It is not ugly number
18005 It is not ugly number
时间限制:2000MS 内存限制:65535K
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC
Description
Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence1, 2, 3, 4, 5, 6, 8, 9, 10, 12, ...shows the
first 10 ugly numbers. By convention, 1 is included. Then, here are the first 10 Not ugly numbers:7, 11, 13, 14, 17, 19,
21, 22, 23, 26. Given the integer n, write a program to find and print the n'th Not ugly number.
输入格式
First line is T(T<=10000), the number of cases.
The T lines following. Each line of the input contains a positive integer n (n <= 100000000).
输出格式
For each case, output the n'th Not ugly number .
输入样例
3
1
2
9
输出样例
7
11
23
作者
admin
要求第n项非丑数;无疑要先利用数学知识求出丑数。我的做法是先预处理前1200个丑数,至于为什么只用处理这个数量的丑数是自己试出来的;可能你会疑惑为什么只用处理一千多个就行了,,因为丑数是因子只含有2、3和5的数字,所以越往后面数字越大它继越有可能包含有不止这三个数的因子;所以前几百项的丑数序列看似是挺密集的,但越到后面每两个丑数间的间隔就越大。而我们要找的第n项非丑数,肯定就在某两个丑数之间。
所以题目唯一的难点就在于求出丑数。我这里用的是优先队列来预处理。 一开始,我们知道前几项丑数:1、2、3、5;那么 如果要得出接下来同样也是因子只有2、3、5的丑数,就只需要将前面这几个已知道的丑数分别乘以2、3、5得出来的数,那它的因子同样一定是只有2、3、5的。 但是,如果将每一项都乘以这三个数的话,你会发现有重复的数字出现。因而这里要用到一个技巧:给每一个数字加多一个标记,用来标注当前这个丑数是由前面的丑数乘以哪个数字得出来的;所以用到了pair<int,int>。第一个数据域存放这个丑数的值,第二个则用来存放标记值。 比如用2分别乘以2、3、5得到4、6、10,那么得到三个pair为<4,2>、<6,3>、<10,5>;然后将这三个pair存入优先队列中去,弹出2;每次再取出最小的丑数(要从小到大取再加上刚刚说的技巧才能避免重复);假设取到pair<6,3>的时候,这时你就只能将6分别乘以3和5,而不能乘2 ( 因为前面会有<4,2>中的4乘以3得到12发生重复 )。 另外,关于得出了丑数之后再求非丑数的技巧写在了代码注释中了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <utility>
#include <vector>
#define ll long long
#define inf 0x3f3f3f3f
#define MAXN 100000
using namespace std; typedef pair<int,int> node_type;
int res[];
int main()
{
//freopen("input.txt","r",stdin);
priority_queue<node_type,vector<node_type>,greater<node_type> > pq;//用来存放pair的优先队列,默认是比较pair中的第一个元素,greater<>则另其每次去最小的数据
pq.push(node_type(,)); //压入第一个丑数
node_type temp;
for(int i=; i<; i++)
{
temp=pq.top(); //取队列首,也就是当前队列中最小的丑数
switch(temp.second) //由pair<>的第二个元素判断当前这个丑数是由哪个标记值生成的;然后继续生成新的丑数
{
case :
pq.push(make_pair(temp.first*,));
case :
pq.push(make_pair(temp.first*,));
case :
pq.push(make_pair(temp.first*,));
}
res[i]=temp.first;
pq.pop();
}
//处理完丑数后
int t,n,cnt,i;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
cnt=;
i=;
while(cnt<n) //cnt标记当前已寻找到的第cnt项的非丑数
{
cnt+=(res[i+]-res[i++]-);//cnt每次加上的值是每相邻两个丑数的差,这个差即这两个丑数之间包含的非丑数的个数
}
//找到所要的第n项非丑数在哪两个丑数之间后退出循环
i--;
cnt-=(res[i+]-res[i]-);//从这个丑数区间的左边开始算,res[i]加上n-cnt就是第n项丑数了
printf("%d\n",res[i]+n-cnt);
}
return ;
}
18005 It is not ugly number的更多相关文章
- [LeetCode] Super Ugly Number 超级丑陋数
Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...
- [LeetCode] Ugly Number II 丑陋数之二
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...
- [LeetCode] Ugly Number 丑陋数
Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers ...
- 【13_263】Ugly Number
简单题 Ugly Number My Submissions Question Total Accepted: 32635 Total Submissions: 94009 Difficulty: E ...
- Leetcode 313. super ugly number
Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...
- Leetcode 264. Ugly Number II
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...
- LeetCode 263 Ugly Number
Problem: Write a program to check whether a given number is an ugly number. Ugly numbers are positiv ...
- [LeetCode] Ugly Number II
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...
- [LeetCode] Ugly Number
Ugly Number Total Accepted: 20760 Total Submissions: 63208 Difficulty: Easy Write a program to check ...
随机推荐
- [Apple开发者帐户帮助]五、管理标识符(5)创建一个iCloud容器
您必须拥有一个或多个iCloud容器才能启用iCloud. 所需角色:帐户持有人或管理员. 在“ 证书”,“标识符和配置文件”中,从左侧的弹出菜单中选择操作系统. 在“标识符”下,选择“iCloud容 ...
- ThinkPHP3.2.3扩展之自动分词获取关键字
ThinkPHP自动获取关键词调用在线discuz词库 先按照下图路径放好插件 /** * 自动获取关键词(调用第三方插件) * @return [type] [description] * www. ...
- myeclipse2014 破解步骤
1.打开破解文件夹Myeclipse 2014 patch,运行run.bat文件 2.在破解界面中,usercode随便输入, systemid 在右边的SystemId按钮处,点击. 将自动生成一 ...
- view在使用shape属性加圆角的同时,用代码修改其他background属性(例如颜色)不生效
项目中一个TextView控件设置了shape属性,给其加了圆角,如下: houlder.mtxtGovernmentType.setBackgroundResource(R.drawable.tv_ ...
- 用DIV遮罩解决checkbox勾选无效的问题
在前端开发的过程中,遇到一种情况,需要勾选,为了用户的操作便捷就将click事件放到了DIV上.(其中使用了knockout.js) 代码大概如下: <div id="one" ...
- php全局变量 超全局变量
php中有许多超全局变量,这意味着它们在一个脚本的全部作用域中都可用.在函数或方法中无需执行 global $variable; 就可以访问它们. 这些超全局变量是: $GLOBALS 引用全局 ...
- CNN结构:用于检测的CNN结构进化-结合式方法
原文链接:何恺明团队提出 Focal Loss,目标检测精度高达39.1AP,打破现有记录 呀 加入Facebook的何凯明继续优化检测CNN网络,arXiv 上发现了何恺明所在 FAIR 团 ...
- handyJson的技术内核
1.swift对象内存模型: 2.指针操作: 3.协议.泛型.扩展: 4.kvc: 1是所有实现的基础,没有内存对象(类)模型,后面的一切都我从谈起. 在1的基础上使用2进行对象模型信息的提取和转换. ...
- 【转】虚拟化(一):虚拟化及vmware产品介绍
由于公司最近在做虚拟化监控,因此就需要把虚拟化方面的知识给学习总结一下,对于虚拟化的概念,摘自百度百科,如下: 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机 ...
- uwsgi部署django,里的request调用的接口响应慢解决方法
解决方法,增加2个线程 uwsgi.ini 配置如下 chdir=/var/www/Ultramanpidfile=/tmp/uwsgi.pidmodule=Ultraman.wsgimaster=t ...