HDU 5878 Count Two Three(二分查找)

题意:
给你一个 n n ,然后让你输出一个大于等于 n n 的特定数字,特定数字是 2 a 3 b 5 c 7 d 2^a\cdot3^b\cdot 5^c\cdot7^d 这种形式的数字。
思路:
首先 n n 的范围只有 1 e 9 1e9 ,也就是说不大于 2 30 2^{30} ,至于3,5,7肯定比30小,所以我们可以四重循环 O ( 3 0 4 O(30^4 )预处理这些特定的数字,给他们设定个上界 1 e 18 1e18 ,把他们放进set里,最后二分查找即可。

ll ak[8][31];
ll rt[] = {2,3, 5,7};
set<ll> st;
int main(){
    for(int i = 0;i < 4;++i){
        ak[rt[i]][0] = 1;
        for(int j = 1;j <= 30;++j){
            ak[rt[i]][j] = ak[rt[i]][j-1] *rt[i];
        }
    }
    int t;
    for(int i = 0;i <= 30;++i){
        for(int j = 0;j <= 28; j ++){
            for(int k = 0;k <= 26;++k){
                for(int p = 0;p <= 24;++p){
                    ll a = ak[2][i],b=ak[3][j],c=ak[5][k],d=ak[7][p];
                    ll pt = N;
                    pt /= a;pt /= b;pt/=c,pt/=d;
                    if(pt == 0) break;
                    else st.insert(a*b*c*d);
                }
            }
        }
    }
    scanf("%d",&t);
    while(t --){
        ll n;
        scanf("%lld",&n);
        printf("%lld\n",*st.lower_bound(n));
    }
}
发布了589 篇原创文章 · 获赞 31 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_43408238/article/details/104133017