hdu5878 I Count Two Three(二分+ 打表)

题目链接:hdu5878 I Count Two Three

题意:给出一个整数n, 找出一个大于等于n的最小整数m, 使得m可以表示为2^a * 3^b * 5^c * 7^d​​.

题解:打表预处理出所有满足要求的数,排个序然后二分查找解决。

 #include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 1e9;
ll s[];
ll pow(ll a, ll b){
ll r = ;
while(b){
if(b & )
r *= a;
a *= a;
b >>= ;
}
return r;
}
int cnt;
void init(){
ll i, j, k ,l, t;
cnt = ;
for(i = ; i < ; ++i){
for(j = ; j < ; ++j){
for(k = ;k < ; ++k){
for(l = ; l < ; ++l){
t = pow(, i) * pow(, j);
if(t > 1e9)
break;
t *= pow(, k);
if(t > 1e9)
break;
t *=pow(, l);
if(t > 1e9)
break;
s[cnt++] = t;
}
}
}
}
sort(s, s + cnt);
}
void bi_search(int n){
int l = ,r = cnt - ;
while(l < r){
int mid = l + (r - l)/;
if(s[mid] >= n)
r = mid;
else
l = mid + ;
}
printf("%I64d\n", s[l]);
}
int main(){
int t, n;
scanf("%d", &t);
init();
while(t--){
scanf("%d", &n);
bi_search(n);
}
return ;
}
上一篇:2017.10.15 解析Java中抽象类和接口的区别


下一篇:常用的Java代码汇总