P1748 H数
题目描述
所谓H数,是指只含有2,3,5,7这些质因数的数,如630是H数,而22不是。现在要求输出第n个H数,为了方便起见将H[1]定为1。已知n不超过10000,最后数据在int64范围之内。
维护一个单调队列或是一个set集合(自带去重)
//维护四个指针,每次取最小值
#include<iostream> #include<cstdio> #include<cmath> #include<set> #define N 10005 using namespace std; int n; long long h[N],a=1,b=1,c=1,d=1; int main() { scanf("%d",&n); h[1]=1; for(int i=2;i<=n;i++){ h[i]=h[a]*2; if(h[i]>h[b]*3) h[i]=h[b]*3; if(h[i]>h[c]*5) h[i]=h[c]*5; if(h[i]>h[d]*7) h[i]=h[d]*7; if(h[i]==h[a]*2) ++a; if(h[i]==h[b]*3) ++b; if(h[i]==h[c]*5) ++c; if(h[i]==h[d]*7) ++d; } printf("%lld ",h[n]); return 0; }
#include<iostream> #include<cstdio> #include<cmath> #include<set> using namespace std; int n; set<long long>S; int main() { scanf("%d",&n); S.insert(1); set<long long>:: iterator it=S.begin(); for(int i=1;i<n;i++){ long long x=*it; S.insert(x*2); S.insert(x*3); S.insert(x*5); S.insert(x*7); it++; } if(!n) printf("0 "); else printf("%lld ",*it); return 0; }