[HDU - 6623] E - Minimal Power of Prime(素數篩+思維)

問題蟲洞:Minimal Power of Prime

 

黑洞內窺:

給你一個數 n ,求n在唯一分解定理式下的最小指數。(2<= n <= 10^18)

 

思維光年:

第一次:

由於n的取值非常的大,一開始就開了6w的數組,然後暴力求解,T~~~~

第二次:

加了一個大素數的判定,繼續T~~~

第n次:

還是T~~~

 

正確的求解:

打一個1~5000的素數表(wc?!),然後你用這5000內的素數去質分解n,

由於n有10^18,所以,要是沒除盡的話,因子最多也就4個了,

所以冪數大於1的情況有p^4,p^3, p^2 , p1^2*p2^2。

暴力判斷;

 

ACcode:

//#include<bits/stdc++.h>
#include  <stdio.h>
#include <iostream>
#include<algorithm>
#include      <map>
#include      <set>
#include   <vector>
#include    <queue>
#include    <stack>
#include <stdlib.h>
#include  <cstring>
#include <string.h>
#include   <string>
#include   <math.h>
#include  <sstream>
using namespace std;
typedef long long ll;
#define MAXN 5000
#define INF 0x3f3f3f3f//將近ll類型最大數的一半,而且乘2不會爆ll
const ll mod = 1000000007;
const double eps = 0.0000001;

bool is[5000];
int prime[5000];
ll tot, n;
void getprime()         //歐拉篩
{
    memset(is, false, sizeof(is));
    tot = 0;
    for(int i=2; i<=MAXN; ++i)
    {
        if(is[i] == false)
            prime[tot++] = i;
        for(int j=0; j<tot && i*prime[j] <= MAXN; ++j)
        {
            is[i*prime[j]] = true;
            if(i%prime[j] == 0)
                break;
        }
    }
}


ll yueshuSUM(ll x)
{
    ll ans = MAXN;
    n = x;
    for(int i=0; i<tot && prime[i] < n; ++i)
    {
        if(n%prime[i] == 0)
        {
            ll k = 0;
            while(n%prime[i] == 0)
            {
                n/=prime[i];
                ++k;
            }
            ans = min(ans, k);
        }
        if(ans == 1)
            return ans;
    }
//    if(n > 1)        //不能特判
//        ans = 1;
    return ans;
}

int main()
{
    getprime();
    int t;
    scanf("%d", &t);
    while(t--)
    {
        ll k, m, sum=0, ans;
        scanf("%lld", &k);
        ans = yueshuSUM(k);
        if(n == 1)
            printf("%lld\n", ans);
        else
        {
            if(ans > 4 && pow(floor(pow(n, 1.0/4)+eps), 4) == n)
                puts("4");
            else if(ans > 3 && pow(floor(pow(n, 1.0/3)+eps), 3) == n)
                puts("3");
            else if(ans > 2 && pow(floor(pow(n, 1.0/2)+eps), 2) == n)
                puts("2");
            else
                puts("1");
        }
    }
    return 0;
}

 

發佈了165 篇原創文章 · 獲贊 35 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章