235倍数 hdu1058加强版

来源:互联网 发布:云计算的基础是什么 编辑:程序博客网 时间:2024/04/30 01:44
求第N小的仅包含1 2 3 5质因子的数。
输入文件(Number.in)
第一行一个数 为数据组数
每组数据仅一个数N
输出文件(Number.out)
对于每组数据输出一个数 即答案
样例输入
10
1
2
3
4
5
6
7
8
9
10
样例输出

1

2
3
4
5
6
8
9
10
12
数据范围
对于30%的数据 N≤100 数据组数≤10
对于50%的数据 N≤10000 数据组数≤50
对于100%的数据 N≤100000 数据组数≤50

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#define mod 1000000using namespace std;int n,t;#define ll long longstruct bignumber{    int a[7],l;}save[110000];bool operator <(bignumber x,bignumber y){    int i;    if(x.l!=y.l) return x.l<y.l;    for(i=x.l;i;i--)      if(x.a[i]!=y.a[i]) return x.a[i]<y.a[i];    return 1;}bool operator ==(bignumber x,bignumber y){    int i;    if(x.l!=y.l) return 0;    for(i=1;i<=x.l;i++) if(x.a[i]!=y.a[i]) return 0;    return 1;}bignumber operator *(bignumber x,int y){    int i;    for(i=1;i<=x.l;i++)        x.a[i]*=y;    for(i=1;i<=x.l;i++)    {        x.a[i+1]+=x.a[i]/mod;        x.a[i]%=mod;    }    if(x.a[x.l+1]!=0) x.l++;    return x;}int main(){    freopen("number.in","r",stdin);    freopen("number.out","w",stdout);    int i;    ll n2=1,n3=1,n5=1;    for(save[1].a[1]=save[1].l=1,i=2;i<=100001;i++)    {      save[i]=min(save[n2]*2,min(save[n3]*3,save[n5]*5));      if(save[i]==save[n2]*2) n2++;      if(save[i]==save[n3]*3) n3++;      if(save[i]==save[n5]*5) n5++;    }    scanf("%d",&t);    while(t--)    {      scanf("%d",&n);      printf("%d",save[n].a[save[n].l]);      for(i=save[n].l-1;i;i--) printf("%06d",save[n].a[i]);      printf("\n");    }    return 0;}


0 0
原创粉丝点击