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 }
我就是我,颜色不一样的烟火 --- geloutingyu