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

    Minimal Power of Prime

    题目传送门

    解题思路

    先打(N^frac{1}{5})内的素数表,对于每一个n,先分解(N^frac{1}{5})范围内的素数,分解完后n变为m,如果m等于1,那么答案就是(N^frac{1}{5})内分解的素数里的最小数量k。否则,继续分解,此时用来分解的质数都是大于(N^frac{1}{5})的,所以最多有4个质数相乘,所以只有三种情况:(P^4),(P^3),(P^2),(P^2*Q^2),以及答案为1的情况(P,Q为大于(N^frac{1}{5})的质数)。对于前两种情况,分别看(m^frac{1}{4})(m^frac{1}{3})是否是整数,对于三四种情况,其实是一样的,只要看(m^frac{1}{2})是不是整数就行了,前四种情况都不是,那么答案就是1。

    代码如下

    #include <bits/stdc++.h>
    #define INF 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    
    inline int read(){
        int res = 0, w = 0; char ch = 0;
        while(!isdigit(ch)){
            w |= ch == '-', ch = getchar();
        }
        while(isdigit(ch)){
            res = (res << 3) + (res << 1) + (ch ^ 48);
            ch = getchar();
        }
        return w ? -res : res;
    }
    
    ll p(ll a, int b)
    {
        ll ans = 1;
        for(int i = 1; i <= b; i ++)
            ans *= a;
        return ans;
    }
    
    int main()
    {
        int t;
        t = read();
        vector<int> vec;
        for(int i = 2; i <= 4000; i ++){
            bool flg = true;
            for(int j = 2; j <= sqrt(i); j ++){
                if(i % j == 0){
                    flg = false;
                    break;
                }
            }
            if(flg)
                vec.push_back(i);
        }
        while(t --){
            ll n;
            scanf("%lld", &n);
            int ans = 100;
            for(int i = 0; i < vec.size(); i ++){
                int t = vec[i];
                int cnt = 0;
                while(n % t == 0){
                    n /= t;
                    ++cnt;
                }
                if(cnt)
                    ans = min(ans, cnt);
            }
            if(n == 1)
                printf("%d
    ", ans);
            else {
                for(int i = 4; i >= 1; i --){
                    if(i == 1)
                        printf("1
    ");
                    else {
                        ll x = max((ll)pow(n, 1.0/i) - 5, 1LL);
                        bool flg = true;
                        ll m = p(x, i);
                        while(m < n){
                            ++ x;
                            m = p(x, i);
                        }
                        if(m == n){
                            printf("%d
    ", min(ans, i));
                            break;
                        }
                    }
                }
            }
        }
        return 0;
    }
    
  • 相关阅读:
    如何彻底卸载Oracle11g
    Oracle 11g的安装
    python 循环队列的实现
    numpy模块学习笔记
    Python 进程之间共享数据
    python异步加协程获取比特币市场信息
    MySQL中, 如何查询某一天, 某一月, 某一年的数据.
    js获取时间
    nodejs爬虫笔记(五)---利用nightmare模拟点击下一页
    nodejs爬虫笔记(四)---利用nightmare解决加载更多问题
  • 原文地址:https://www.cnblogs.com/whisperlzw/p/11280677.html
Copyright © 2011-2022 走看看