题目链接:hdu5878 I Count Two Three
题意:给出一个整数n
, 找出一个大于等于n
的最小整数m
, 使得m
可以表示为2^a * 3^b * 5^c * 7^d
.
题解:打表预处理出所有满足要求的数,排个序然后二分查找解决。
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 typedef long long ll; 5 const int N = 1e9; 6 ll s[10000]; 7 ll pow(ll a, ll b){ 8 ll r = 1; 9 while(b){ 10 if(b & 1) 11 r *= a; 12 a *= a; 13 b >>= 1; 14 } 15 return r; 16 } 17 int cnt; 18 void init(){ 19 ll i, j, k ,l, t; 20 cnt = 0; 21 for(i = 0; i < 31; ++i){ 22 for(j = 0; j < 20 ; ++j){ 23 for(k = 0 ;k < 14 ; ++k){ 24 for(l = 0; l < 12; ++l){ 25 t = pow(2, i) * pow(3, j); 26 if(t > 1e9) 27 break; 28 t *= pow(5, k); 29 if(t > 1e9) 30 break; 31 t *=pow(7, l); 32 if(t > 1e9) 33 break; 34 s[cnt++] = t; 35 } 36 } 37 } 38 } 39 sort(s, s + cnt); 40 } 41 void bi_search(int n){ 42 int l = 0,r = cnt - 1; 43 while(l < r){ 44 int mid = l + (r - l)/2; 45 if(s[mid] >= n) 46 r = mid; 47 else 48 l = mid + 1; 49 } 50 printf("%I64d ", s[l]); 51 } 52 int main(){ 53 int t, n; 54 scanf("%d", &t); 55 init(); 56 while(t--){ 57 scanf("%d", &n); 58 bi_search(n); 59 } 60 return 0; 61 }