HDU 6623"Minimal Power of Prime"(数学)

传送门

•题意

  给你一个大于 1 的正整数 n;

  它可以分解成不同的质因子的幂的乘积的形式,问这些质因子的幂中,最小的幂是多少。

•题解

  定义 $ans$ 表示最终答案;

  ①如果 $ans ge 5$:

    那么,肯定有 $n=p^{ans} , p le sqrt[{ans}]{n}$,也就是说 $ p le 10^{frac{18}{5}}$;

  所以,我们可以提前预处理出 $[1,10000]$ 内的素数,筛出 $n$ 中属于 $[1,10000]$ 内的质因子;

  如果在这个过程中出现 $n=1$ 或者 $ans=1$,那么直接返回 $ans$ 即可;

  如果筛完 $[1,10000]$ 内的素数后,$n > 1$,那么,就有如下情况:

    (1)存在质数 p,满足 p > 10000 并且 n 只能分解出一个 p,此时应输出 1;

    (2)存在质数 p,q,满足 p > 10000 , q > 10000,有 $n = p^2$ 或 $n = p^2 cdot q^2$,对于这种情况,$n$ 肯定是个完全平方数;

    (3)存在质数 p,满足 p > 10000,并且有 $n=p^3$,这种情况下,$n$ 肯定是个立方数;

    (4)存在质数 p,满足 p > 10000,并且有 $n=p^4$;

  如果情况(1)成立,那么,情况(2)(3)(4)肯定不成立,但是情况(1)可能不好直接判断;

  那么,我们可以先判断情况(4)(2)(3)是否成立,如果不成立,那么(1)肯定成立;

  疑惑(1):如果 $(sqrt[4]{n})^4=n$,那为什么一定有 $sqrt[4]{n}$ 为素数呢?

    定义 $x=sqrt[4]{n}$,那么有 $x le 10^{frac{18}{4}}$;

    如果 $x$ 为合数,那么势必存在某个大于 1 因子 f,$f le sqrt{x} < 10^4$;

    但,来到此步的条件是 $n$ 中所有属于 $[1,10000]$ 内的质因子已被筛走,所以,是不存满足条件的 $f$ 的;

       所以说,$x$ 一定是个素数;

  疑惑(2):为什么要先判断情况(4)再判断情况(2):

    因为满足情况(4)肯定满足情况(2),但是此时满足情况(2)的因子就不是质因子了;

•Code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define mem(a,b) memset(a,b,sizeof(a))
 5 const int N=1e4;
 6 
 7 ll n;
 8 int cnt;
 9 int prime[N];
10 bool isPrime[N+50];
11 
12 void Prime()
13 {
14     cnt=0;
15     mem(isPrime,true);
16     isPrime[1]=false;
17 
18     for(int i=2;i <= N;++i)
19     {
20         if(isPrime[i])
21             prime[++cnt]=i;
22 
23         int x;
24         for(int j=1;j <= cnt && (x=i*prime[j]) <= N;++j)
25         {
26             isPrime[x]=false;
27 
28             if(i%prime[j] == 0)
29                 break;
30         }
31     }
32 }
33 bool Calc(ll x)
34 {
35     int l=1,r=(int)1e6+1;
36     while(r-l > 1)
37     {
38         ll mid=l+((r-l)>>1);
39         if(mid*mid*mid > x)
40             r=mid;
41         else
42             l=mid;
43 
44         if(mid*mid*mid == x)
45             return true;
46     }
47     return false;
48 }
49 int Solve()
50 {
51     int ans=100;
52     for(int i=1;i <= cnt;++i)
53     {
54         int k=0;
55         while(n%prime[i] == 0)
56         {
57             k++;
58             n /= prime[i];
59         }
60         if(k)
61             ans=min(ans,k);
62 
63         if(n == 1 || ans == 1)
64             return ans;
65     }
66 
67     ll x=sqrt(sqrt(n));
68     ll y=sqrt(n);
69 
70     if(x*x*x*x == n)
71         ans=min(ans,4);
72     else if(y*y == n)
73         ans=min(ans,2);
74     else if(Calc(n))
75         ans=min(ans,3);
76     else
77         ans=1;
78 
79     return ans;
80 }
81 int main()
82 {
83     Prime();
84 
85     int T;
86     scanf("%d",&T);
87     while(T--)
88     {
89         scanf("%lld",&n);
90         printf("%d
",Solve());
91     }
92     return 0;
93 }
View Code
原文地址:https://www.cnblogs.com/violet-acmer/p/11708166.html