P1748 H数 题解

原题链接

简要题意:

求第 \(k\) 个质因子只包含 \(2,3,5,7\) 的数。规定 \(1\) 是第一个这样的数。

显然,本题可以用数组实现,用四个指针,将最小的往前进一发。

但是,有 \(\texttt{STL}\) 和 这么弱的数据,我们还需要维护什么?

你发现,需要去重和排序。这不就是 \(\text{set}\) 的标本?

每次取出 \(\text{set}\) 第一个元素 \(x\),并将 \(x \times 2,3,5,7\) 均重新插入集合,同时将答案指针往后移一位。

最后输出指针指向的值即可。

时间复杂度:\(O(n \log n)\).(\(\text{set}\) 它弄出来了一个 \(\texttt{log}\))

实际得分:\(100pts\).

注:请注意判断 \(0\),否则只能得到 \(94pts\).

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

inline int read(){char ch=getchar();int f=1;while(ch<‘0‘ || ch>‘9‘) {if(ch==‘-‘) f=-f; ch=getchar();}
	int x=0;while(ch>=‘0‘ && ch<=‘9‘) x=(x<<3)+(x<<1)+ch-‘0‘,ch=getchar();return x*f;}

int main(){
	int n=read(); set<ll> s;
	if(!n) {puts("0");return 0;}
	s.insert(1); set<ll>::iterator i=s.begin();
	n--; //我们去掉1
	while(n--) {
		ll x=*i; //集合中第 i 小的
		s.insert(x*2); s.insert(x*3);
		s.insert(x*5); s.insert(x*7);
		i++; //指针后移
	} printf("%lld\n",*i);
	return 0;
}

原文地址:https://www.cnblogs.com/bifanwen/p/12598729.html

时间: 2024-10-08 16:41:35

P1748 H数 题解的相关文章

题解 P1748 【H数】

我来讲讲 \(dp\) 的做法 前言 昨天 \(PHY\) 大佬问我,这题怎么做?考虑到他没学过 \(set\) . \(priority_queue\) 和 \(queue\) .之后,我就想到了可以用 \(dp\) 来解决这道题. 正文 设置状态 很显然,我们可以用 \(f[i]\) 表示第\(i\)个数是多少. 转移 第\(i\)个\(H\)数是多少,我们显然应该从前面的\(i-1\)个数去分别\(\times2\).\(\times3\).\(\times5\).\(\times7\)中

H.数7(模拟)

1212: H.数7 时间限制: 1 Sec  内存限制: 64 MB 提交: 8  解决: 5 标签提交统计讨论版 题目描述 数7是一个简单的饭桌游戏,有很多人围成一桌,先从任意一人开始数数,1.2.3……那样数下去,逢到7的倍数(7.14.21……)和含有7的数字(17.27……)必须以敲桌子代替.如果有谁逢7却数出来了,就要接受惩罚.小明觉得这个游戏太简单了,于是对它做出了改进,那就是每逢到素数的时候就以敲桌子代替,并且数数的方向发生改变,而且最开始的那个人可以从1到10000中选一个合数

【BZOJ1026】windy数题解

题面 [题目描述] windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? [输入] 包含两个整数,A B. [输出] 一个整数. [输入样例一] 1 10 [输入样例二] 25 50 [输出样例一] 9 [输出样例二] 20 [数据规模和约定] 100%的数据,满足 1 <= A <= B <= 2000000000 . 题解 分析 头一次接触数位DP啊 然而这题只要这样

Noip2006 2^k进制数题解

题目描述 Description 设r是个2k进制数,并满足以下条件: (1)r至少是个2位的2k进制数. (2)作为2k进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后,则q的总位数不超过w. 在这里,正整数k(1≤k≤9)和w(k<W≤30000)是事先给定的. 问:满足上述条件的不同的r共有多少个? 我们再从另一角度作些解释:设S是长度为w的01字符串(即字符串S由w个"0"或"1"组成),S对应于上述条件(3)

【基础练习】【字符串处理】codevs1264 芳香数题解

题目来源 2012CCC加拿大高中信息学奥赛(这个系列基本都是基础练习题,想打好最基础的基础的同学们可以试一试) 题目描述 Description This question involves calculating the value of aromatic numbers which are a combination of Arabic digits and Roman numerals. 本题是关于计算芳香数数值的问题,芳香数是阿拉伯数字和罗马数字的组合. An aromatic num

BZOJ3930:[CQOI2015]选数——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=3930 https://www.luogu.org/problemnew/show/P3172#sub 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研究.然而他很快发现工作量太大了,于是向你寻求帮助.你的任务很简单,小z会告诉你一个整数K,你需要回答他最

yzoj P2349 取数 题解

题意 1到n个自然数中选k个自然数要求两两不相邻,问有多少种方法,模m eg(1 3 5 ) 又是一道打表规律题,正常解法dp可以通过前缀和优化到O(N* K).另外我们可以重新定义F[I,J]表示从1到I中选择J个不连续数的方案数.通过考虑I选还是不选来进行状态转移. 1.如果不选I:则方案数为F[I-1,J]; 2.如果选I:由于不能选相邻两个数,所以I-1不能选,则剩余的J-1个数只能在1到I-2中选,即F[I-2,J-1]; f[i][j]=f[i-1][j]+f[i-2][j-1] (

【基础练习】【字符串处理】noip2011普及组第2题 统计单词数题解

这又是一道成功加入"容易吗"系列的基础题= =原本很简单,可是我一开始太大意看错了题,以为是让输出该单词是第几个单词,实际上应该输出该单词的首字母在第几个位置:改过后只得了二十分,看了一组数据,原来第一个单词前面可以有前导空格--幸亏其他单词前没有,否则还真不知道怎么办:实现的时候又出了各种问题.于是我决定总结一下. 题目: 给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置.注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大

【日常学习】【floyd传递闭包+高精】codevs1009 产生数题解

题目描述 Description 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则: 一位数可变换成另一个一位数: 规则的右部不能为零. 例如:n=234.有规则(k=2): 2-> 5 3-> 6 上面的整数 234 经过变换后可能产生出的整数为(包括原数): 234 534 264 564 共 4 种不同的产生数 问题: 给出一个整数 n 和 k 个规则. 求出: 经过任意次的变换(0次或多次),能产生出多少个不同整数. 仅要求输出个数. 输入描述