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;
}