zoukankan      html  css  js  c++  java
  • [2019杭电多校第四场][hdu6623]Minimal Power of Prime

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6623

    题目大意为求一个数的唯一分解的最小幂次。即120=23*31*51则答案为1。

    因为数字太大不能直接分解,所以可以先分解1e4内的素因子,这样所有幂次可能>=5的数都被分解了,然后判断剩余的数是否是一个数的4次方如果是的话ans=min(ans,4),

    如果不是的话再判断是不是一个数的3次方,如果是的话ans=min(ans,3)。

    如果不是的话就判断是不是一个数的平方,如果是ans=min(ans,2),如果不是那么ans=1。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<string>
     5 #include<algorithm>
     6 using namespace std;
     7 typedef long long ll;
     8 const int maxn = 10000;
     9 int a[10005], tot;
    10 ll b[10005];
    11 void init() {
    12     tot = 0;
    13     for (int i = 2; i <= 10000; i++)
    14         if (a[i] == 0) {
    15             b[tot++] = (ll)i;
    16             for (int j = i * 2; j <= 10000; j += i)
    17                 a[j] = 1;
    18         }
    19 }
    20 int check(ll n) {
    21     ll l = 1, r = pow(n*1.0, 1.0 / 3) + 1;
    22     while (l <= r) {
    23         ll mid = (l + r) >> 1;
    24         ll y = mid * mid*mid;
    25         if (y == n) return 1;
    26         else if (y > n) r = mid - 1;
    27         else l = mid + 1;
    28     }
    29     return 0;
    30 }
    31 int main() {
    32     init();
    33     int t;
    34     scanf("%d", &t);
    35     while (t--) {
    36         ll n;
    37         scanf("%lld", &n);
    38         int x, ans = 100;
    39         for (int i = 0; i < tot; i++) {
    40             if (n < b[i]) break;
    41             x = 0;
    42             if (n%b[i] == 0) {
    43                 while (n%b[i] == 0) {
    44                     n /= b[i];
    45                     x++;
    46                 }
    47                 ans = min(ans, x);
    48             }
    49         }
    50         if (n == 1 || ans == 1) printf("%d
    ", ans);
    51         else {
    52             ll m1 = (ll)sqrt(sqrt(n*1.0));
    53             ll m2 = (ll)sqrt(n*1.0);
    54             if ((m1*m1*m1*m1) == n) ans = min(ans, 4);
    55             else if (check(n) == 1) ans = min(ans, 3);
    56             else if (m2*m2 == n) ans = min(ans, 2);
    57             else ans = 1;
    58             printf("%d
    ", ans);
    59         }
    60     }
    61     return 0;
    62 }



  • 相关阅读:
    深究递归和迭代的区别、联系、优缺点及实例对比
    提高Python运行效率的六个窍门
    C++设计模式——单例模式
    使用Python的turtle库实现七段数码管绘制
    Python 死循环和嵌套循环
    Python 随机数 random
    更改 pandas dataframe 中两列的位置
    Pandas中DataFrame修改列名
    MM 算法与 EM算法概述
    机器学习中的训练集、验证集和测试集
  • 原文地址:https://www.cnblogs.com/sainsist/p/11350536.html
Copyright © 2011-2022 走看看