P1748 H数 题解

博客园同步

原题链接

简要题意:

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

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

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

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

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

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

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

实际得分: 100 p t s 100pts .

注:请注意判断 0 0 ,否则只能得到 94 p t s 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;
}

发布了27 篇原创文章 · 获赞 33 · 访问量 528

猜你喜欢

转载自blog.csdn.net/bifanwen/article/details/105261640