• HDU 6623 Minimal Power of Prime(数学)


    传送门

    •题意

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

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

    •题解

    把[1,10000]内的素数筛出来,然后对于每个素$P$数遍历找$P_{k}$的$k$,用$ans$来维护最小的$k$

    对于大于10000的素数,$(10^{4})^{4}<10^{18}<(10^{4})^{5}$,所以最大是4次方

    先看4次方:

    若$x^{4}==n$,则$x$一定是素数,为什么是素数?

    根据欧拉定理,一个数可以分成若干个素数乘积的形式。如$m=p_{1}^{k1}cdot p_{2}^{k2}cdot p_{3}^{k3}cdot p_{4}^{k4}cdot p_{5}^{k5}$

    假设$p_{1},p_{2},p_{3}$为$10000$以内的素数,$p_{4},p_{5}$为大于$10000$的素数。

    由于$n$的$10000$以内的素数都被消去了,现只剩下$p_{4}^{k4}cdot p_{5}^{k5}=n$

    因为$p_{4}^{k4}cdot p_{5}^{k5}=n=x^{4}$,由上只上限是4, 为了方便设$k4=k5=4$,所以$p_{4}^{4}cdot p_{5}^{4}$可以合并为$(p_{4}p_{5})^{4}$,也就是$x=(p_{4}p_{5})$这个合数。

    但是$p_{4},p_{5}$都是$>10^{4}$,所以$x=(p_{4}p_{5})>10^{8}$,即$n=x^{4}=(p_{4}p_{5})^{4}>10^{18}$,与题意矛盾

    再看2次方

    若$x^{2}==n$,则$x$可能是合数可能是素数?

      如果是4次方的话肯定不能是2次方,由上只$x$是个素数,那$y=x^{2}$的话,$y$就是合数了,所以2次方4次方只能存在一个

    如果不是4次方的话,可以是2次方有两种情况,$x$是素数和$x$是合数,素数符合是明显的,那合数为什么符合呢

    仍然以上述例子$m=p_{1}^{k1}cdot p_{2}^{k2}cdot p_{3}^{k3}cdot p_{4}^{k4}cdot p_{5}^{k5}$

    假设$p_{1},p_{2},p_{3}$为$10000$以内的素数,$p_{4},p_{5}$为大于$10000$的素数。

    由于$n$的$10000$以内的素数都被消去了,现只剩下$p_{4}^{k4}cdot p_{5}^{k5}=n$

    因为$p_{4}^{k4}cdot p_{5}^{k5}=n=x^{2}$,由上面上限是4同理知上限是2,为了方便设$k4=k5=2$,所以$p_{4}^{2}cdot p_{5}^{2}$可以合并为$(p_{4}p_{5})^{2}$,也就是$x=(p_{4}p_{5})$这个合数。对于$p_{4}^{2}$这个素数来说是2,对于$p_{5}^{2}$这个素数来说也是2,对于$(p_{4}p_{5})^{2}$这个合数可以分成$p_{4}^{2} p_{5}^{2}$这两个素数,也是2.

    3次方与4次方同理

    如果都不是的话,就只剩下一个素数了,那就是1

    •代码

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int maxn=1e4;
     5 const int mmaxn=1e6;
     6 int prime[maxn];
     7 bool Mark[maxn+50];
     8 int num;
     9 void Prime()
    10 {
    11     for(int i=2;i<=maxn;i++)
    12     {
    13         if(Mark[i]==0)
    14             prime[num++]=i;
    15         for(int j=0;j<num&&prime[j]*i<=maxn;j++)
    16         {
    17             Mark[i*prime[j]]=1;
    18             if(i%prime[j]==0)
    19                 break;
    20         }
    21     }
    22 }
    23 int main()
    24 {
    25     Prime();
    26     int T;
    27     scanf("%d",&T);
    28     while(T--)
    29     {
    30         ll n;
    31         scanf("%lld",&n);
    32         int ans=100;
    33         for(int i=0;i<num;i++)
    34         {
    35             int cur=0;
    36             while(n%prime[i]==0)
    37             {
    38                 n/=prime[i];
    39                 cur++;
    40             }
    41             if(!cur)
    42                 continue;
    43             ans=min(ans,cur);
    44             if(ans==1||n==1)
    45             {
    46                 printf("%d
    ",ans);
    47                 break;
    48             }
    49         }
    50         if(ans==1||n==1)
    51             continue;
    52 
    53         ll x=sqrt(sqrt(n));
    54         ll y=sqrt(n);
    55         
    56         if(x*x*x*x==n)///4
    57             ans=min(ans,4);
    58         else if(y*y==n)///2
    59             ans=2;
    60         else///3
    61         {
    62             bool flag=false;
    63             ll l=maxn-1,r=mmaxn+1;
    64             while(r-l>1)
    65             {
    66                 ll mid=(l+r)>>1;
    67                 if(mid*mid*mid>n)
    68                     r=mid;
    69                 else
    70                     l=mid;
    71                 if(mid*mid*mid==n)
    72                 {
    73                     flag=true;
    74                     ans=min(ans,3);
    75                     break;
    76                 }
    77             } 
    78             if(!flag)
    79                 ans=1;
    80         }
    81         printf("%d
    ",ans);
    82     }
    83 }
    View Code
  • 相关阅读:
    Dos.ORM logo.Net轻量级开源ORM框架 Dos.ORM
    C# FUNC 应用
    WCF教程网址
    C#扩展方法实现 byte[] 输出为HEX字符串形式
    apache配置,禁止指定后缀访问
    IServerChannelSinkProvider
    在服务器端的远程对象中加上抽象工厂的接口和实现类
    pannel加载窗体
    权限框架
    工作周记
  • 原文地址:https://www.cnblogs.com/MMMinoz/p/11710061.html
Copyright © 2020-2023  润新知