HDU - 6623 Minimal Power of Prime 因子幂最小(暴力+思维)

Dear 丶 2021-11-14 15:04 249阅读 0赞

题意:输出n所有质因子幂的最小值。

分析:打出10000以内的素数,把 n 分解质因数,如果 n 分解完不为1或者最小幂已经为1,可以直接输出结果,否则分4种情况,n是一个质数的4次方,n是一个质数的3次方,n是一个质数的2次方,n是一个或多个不同质数相乘得到,讨论出前三种情况即可。注意精度问题。

代码:

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N = 1e4+5;
  5. int vs[N],p[N],cnt,t;
  6. void init() {
  7. for (int i = 2; i <= N; i++) {
  8. if (!vs[i]) p[++cnt] = i;
  9. for (int j = 1; j <= cnt && p[j] * i <= N; j++) {
  10. vs[i * p[j]] = 1;
  11. if (i % p[j] == 0) break;
  12. }
  13. }
  14. }
  15. ll qp(ll x, int y) {
  16. ll ans = 1;
  17. for(int i=1;i<=y;i++) ans*=x;
  18. return ans;
  19. }
  20. ll n;
  21. int main() {
  22. scanf("%d",&t);
  23. init();
  24. while (t--) {
  25. scanf("%lld", &n);
  26. int ans = 1e9;
  27. for (int i = 1; i <= cnt && p[i] <= n; i++)
  28. if (n % p[i] == 0) {
  29. int tp = 0;
  30. while (n % p[i] == 0) tp++, n /= p[i];
  31. ans = min(ans, tp);
  32. }
  33. if (n == 1 || ans==1 ) {
  34. printf("%d\n", ans);
  35. continue;
  36. }
  37. int x = pow(n, 1.0 / 4);
  38. if (qp(x, 4) == n || qp(x + 1, 4) == n || qp(x - 1, 4) == n) ans = min(ans, 4);
  39. else {
  40. x = pow(n, 1.0 / 3);
  41. if (qp(x, 3) == n || qp(x + 1, 3) == n || qp(x - 1, 3) == n) ans = min(ans, 3);
  42. else {
  43. int x = pow(n, 0.5);
  44. if (qp(x, 2) == n || qp(x + 1, 2) == n || qp(x - 1, 2) == n) ans = min(ans, 2);
  45. else ans = 1;
  46. }
  47. }
  48. printf("%d\n",ans);
  49. }
  50. return 0;
  51. }

发表评论

表情:
评论列表 (有 0 条评论,249人围观)

还没有评论,来说两句吧...

相关阅读

    相关 生成树prime

    prime算法 每次加入已(加入树集合)结点连着(未加入树)的最短边直至所有结点加入最小生成树 源代码: \include<stdio.h> \include<std