2019杭电多校赛第四场 HDU6623 Minimal Power of Prime 素数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6623
题意:
输出将一个数n(1e18)质因数分解后其所有质因数幂的最小值
分析:
我们暴力去除 内的所有质因数,那么剩下的为.单独判断即可。
代码:
#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; }
本文作者:kingwzun
本文链接:https://www.cnblogs.com/kingwz/p/16505773.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步