2019杭电多校赛第四场 HDU6623 Minimal Power of Prime 素数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6623
题意:
输出将一个数n(1e18)质因数分解后其所有质因数幂的最小值

分析:
我们暴力去除\(1e18^{1/5}\) 内的所有质因数,那么剩下的为\(a^4,a^3,a^2b^2,other\).单独判断即可。
代码:

#include <iostream>
#include <cstring>
#include <vector>
#include <bits/stdc++.h>
#define endl '\n'
//#pragma GCC optimize(3)
#define int long long
#define pii pair<int, int>
using namespace std;
const int N = 1e5 + 10;
int min(int a, int b)
{
    if (a > b)
        return b;
    else
        return a;
}
int primes[N], top = 0; //存储素数
bool st[N];             //记录是否为素数
void get_prime(int n)
{
    st[1] = true;
    for (int i = 2; i <= n; i++)
    {
        if (!st[i])
            primes[top++] = i;
        for (int j = 0; j * i <= n && j < top; j++)
        {
            st[i * primes[j]] = true;
            if (i % primes[j] == 0) //关键
                break;
        }
    }
}
int three(int n)
{
    int l = 1, r = pow(n * 1.0, 1.0 / 3) + 1, mid;
    while (l <= r)
    {
        mid = (l + r) >> 1;
        if (mid * mid * mid == n)
            return mid;
        else if (mid * mid * mid > n)
            r = mid - 1;
        else
            l = mid + 1;
    }
    return -1;
}
void solve()
{
    int n;
    cin >> n;
    int ans = 1000;
    for (int i = 0; i < top; i++)
    {
        if (1LL * primes[i] * primes[i] > n) break; 

        int cnt = 0;
        while (n % primes[i] == 0)
        {
            cnt++;
            n /= primes[i];
        }
        if (cnt)
            ans = min(ans, cnt);
    }
    if (ans == 1)
    {
        cout << 1 << endl;
        return;
    }
    //如果n不为零,则说明他有大于1e4的质因子
    //因为他们都大于1e4,即便n取最大1e18也顶多四次
    if (n > 1)
    {
        int k1 = sqrt(n);
        if (k1 * k1 == n)
        {
            int k2 = sqrt(k1);
            if (k2 * k2 == k1)
                ans = min(ans, 4);
            else
                ans = min(ans, 2);
        }
        else
        {
            int k3 = three(n);
            if (k3 * k3 * k3 == n)
                ans = min(ans, 3);
            else
                ans = 1;
        }
    }
    cout << ans << endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    get_prime(10000);
    int t;
    cin >> t;

    while (t--)
        solve();
    return 0;
}
posted @ 2022-07-22 14:57  kingwzun  阅读(26)  评论(0编辑  收藏  举报