首相の2019ハング電動マルチ学校第hdu6623最小の電源

首相の最小の電源

トピックポータル

問題解決のためのアイデア

ヒット\(N ^ \ FRAC {1 } {5} \) 各nについての素数テーブルその中、第一分解\(N ^ \ FRAC {1 } {5} \) 分解の範囲の素数後mが1に等しい場合、N Mと、答えは\(N ^ \ FRAC {1 } {5} \) 最小数kの内部分解素数。そうでなければ、その後素数を超える破壊するために使用され、破壊し続ける({1 N ^ \ FRAC \ } {5} \) :、そう4つの素数の最大値は、これだけ3例乗算\(^ Pを4 \) \(P ^ 3 \) \(P ^ 2 \) \(^ 2 \ P ^ 2 * Q) 及び答えがそうである(P、Q 1は以上である\(N ^ \ FRAC 5}、{1} {\)素数)。最初の二つの場合について、それぞれ、参照\(M ^ \ FRAC。1 {{}}。4 \)、\ (M ^ \ FRAC。1 {{}}。3 \)数であり、3〜4例のために、実際には、同じです限りルックとして\(M ^ \ FRAC {1 } {2} \) ラインに整数でない、の最初の4つのではなく、答えは1です。

コードは以下の通りです

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

inline int read(){
    int res = 0, w = 0; char ch = 0;
    while(!isdigit(ch)){
        w |= ch == '-', ch = getchar();
    }
    while(isdigit(ch)){
        res = (res << 3) + (res << 1) + (ch ^ 48);
        ch = getchar();
    }
    return w ? -res : res;
}

ll p(ll a, int b)
{
    ll ans = 1;
    for(int i = 1; i <= b; i ++)
        ans *= a;
    return ans;
}

int main()
{
    int t;
    t = read();
    vector<int> vec;
    for(int i = 2; i <= 4000; i ++){
        bool flg = true;
        for(int j = 2; j <= sqrt(i); j ++){
            if(i % j == 0){
                flg = false;
                break;
            }
        }
        if(flg)
            vec.push_back(i);
    }
    while(t --){
        ll n;
        scanf("%lld", &n);
        int ans = 100;
        for(int i = 0; i < vec.size(); i ++){
            int t = vec[i];
            int cnt = 0;
            while(n % t == 0){
                n /= t;
                ++cnt;
            }
            if(cnt)
                ans = min(ans, cnt);
        }
        if(n == 1)
            printf("%d\n", ans);
        else {
            for(int i = 4; i >= 1; i --){
                if(i == 1)
                    printf("1\n");
                else {
                    ll x = max((ll)pow(n, 1.0/i) - 5, 1LL);
                    bool flg = true;
                    ll m = p(x, i);
                    while(m < n){
                        ++ x;
                        m = p(x, i);
                    }
                    if(m == n){
                        printf("%d\n", min(ans, i));
                        break;
                    }
                }
            }
        }
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/whisperlzw/p/11280677.html