求大于等于n的2^a * 3^b * 5^c * 7^d (a,b,c,d >= 0,1 <= n <= 1e9)
1.1e9有10位数
2 ^ 32 > 1e9, 3 ^ 19 > 1e9 , 5 ^ 13 > 1e9 , 7 ^ 11 > 1e9
2.大于1e9及时退出,不存入set
#include <iostream>
#include <cstdio>
#include <set>
#include <cmath>
using namespacestd;
typedef longlong ll;
set<ll> s;
ll f[4][35];
ll a[4] = {2ll,3ll,5ll,7ll};
int b[4] = {33,20,14,12};
void pre()
{
ll ans =1ll;
for (int i =0; i < 4; i ++) {
ans = 1ll;
for (int j =0; j < b[i]; j ++) {
f[i][j] = ans;
ans *= a[i];
// cout << f[i][j] << endl;
}
}
ans = 1ll;
for (int i =0; i < 33; i ++) {
ans *= (i ? 2 :1); if(ans >1e9) {ans /= f[0][i];break;}
for (int j =0; j < 20; j ++) {
ans *= (j ? 3 :1); if(ans >1e9) {ans /= f[1][j];break;}
for (int k =0; k < 14; k ++) {
ans *= (k ? 5 :1); if(ans >1e9) {ans /= f[2][k];break;}
for (int m =0; m < 12; m ++) {
ans *= (m ? 7 :1);
if(ans >1e9) {ans /= f[3][m];break;}
// cout << i << ' ' << j << ' ' << k << ' ' << m << ' ';
s.insert(ans);
//if(s.find(ans) != s.end()) {cout << ans << " insert succ. id = " << cnt;cnt ++;}
//cout << endl;
}
}
}
}
//cout << s.size() << endl; // 5174个
}
int main()
{
pre();
int t;
cin >> t;
while (t --) {
ll n;
scanf("%lld",&n);
printf("%lld\n",*s.lower_bound(n));
}
return0;
}
ps:看见有大神直接写快速幂函数,计算,存数组,sort,二分的。