hdu5878(枚举,打表)

题目链接:hdu5878

题意:到一行输入t,表示下面有t组数据,然后下面t行每行输入一个数n;

定义x==2^a*3^b*5^c*7^d(a, b, c, d为自然数,x不大于1e+9);

要求对于每一个n输出>=n的最小x;

 

思路:由于x比较大,可以先打个表;

依次枚举a,b,c,d将所有不大于1e+9的x存到数组a中,再用;lower_bound()找一下即可;

 

代码:

 1 #include<bits/stdc++.h>
 2 #define MAXN 10000
 3 #define MAX 1000000000
 4 #define eps 1e-6
 5 #define ll long long
 6 using namespace std;
 7 
 8 ll a[MAXN];
 9 
10 void get_number(void)  //***打表,将所有不大于1e+9的x存数组a中
11 {
12     ll flag;
13     int pos=0;
14     for(int i=0; pow(2, i)<=MAX; i++)
15     {
16         for(int j=0; pow(2, i)*pow(3, j)<=MAX; j++)
17         {
18             for(int k=0; pow(2, i)*pow(3, j)*pow(5, k)<=MAX; k++)
19             {
20                 for(int l=0; pow(2, i)*pow(3, j)*pow(5, k)*pow(7, l)<=MAX; l++)
21                 {
22                     a[pos++]=pow(2, i)*pow(3, j)*pow(5, k)*pow(7, l);
23                 }
24             }
25         }
26     }
27 }
28 
29 int main(void)
30 {
31     std::ios::sync_with_stdio(false), cin.tie(0), cin.tie(0);
32     ll t, n;
33     get_number();
34     sort(a, a+MAXN);
35     cin >> t;
36     while(t--)
37     {
38         cin >> n;
39         int pos=lower_bound(a, a+MAXN, n)-a;   //****二分查找第一个大于等于n的数,返回指针;
40         cout << a[pos] << endl;
41     }
42     return 0;
43 }

 

posted @ 2016-09-21 19:02  geloutingyu  阅读(179)  评论(0编辑  收藏  举报