• Minimal Power of Prime


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

    题意:给你一个10^18的数n,要你求n的质因子中的最低次幂是多少,比如 12=2^2 * 3^1;12的质因子中最低次幂为1;

    思路:由于有t组数据,(t<=10^5),所以不能暴力去写,可以先将n^(0.2)中的素数打个表出来,如果n除完这些素数还大于1,那剩下的n最多是4个素数的乘积。

    a^4, a^3, a^2, a^2*b^2, 其他的最低次幂肯定是1了,所以只需要讨论这几种情况

    如果是a^4,   mi=min(mi,4);

    如果是a^3   mi=min(mi,3);

    如果是a^2或a^2*b^2   mi=min(mi,2);

    否则   mi=1;

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    int a[10005],b[10005];
    long long int fun(long long int x,int y)
    {
             long long int ans=1;
             for(int i=0;i<y;i++)
                  ans=ans*x;
             return ans;
    }
    int main()
    {
              int t,k=0,mi;
              for(int i=2;i<=10000;i++)
              {
                    if(b[i]==0)
                    {
                        a[k++]=i;
                        for(int j=i+i;j<=10000;j=j+i)
                            b[j]=1;
                    }
               }
              while(~scanf("%d",&t))
              {
                      while(t--)
                      {
                           mi=100;
                           long long int n;
                           scanf("%lld",&n);
                           int x=pow(n,1/5.0);
                           for(int i=0;i<k;i++)
                           {
                                   if(a[i]>x)
                                       break;
                                   int s=0;
                                  while(n%a[i]==0)
                                  {
                                         n=n/a[i];
                                         s++;
                                   }
                                  if(s>0)
                                  mi=min(mi,s);
                                  if(n==1||mi==1)
                                       break;
                           }
                           if(n>1)
                           {
                                   long long int s2=pow(n,1.0/2);
                                   long long int s3=pow(n,1.0/3);
                                   long long int s4=pow(n,1.0/4);
                                  if(fun(s4,4)==n||fun(s4-1,4)==n||fun(s4+1,4)==n)//之所以要 -1 +1,是因为pow时精度有可能不是很准
                                           mi=min(mi,4);
                                  else if(fun(s3,3)==n||fun(s3-1,3)==n||fun(s3+1,3)==n)
                                           mi=min(mi,3);
                                 else if(fun(s2,2)==n||fun(s2-1,2)==n||fun(s2+1,2)==n)
                                          mi=min(mi,2);
                                else
                                       mi=1;
                        }
                       printf("%d ",mi);
                  }
            }
    return 0;
    }

  • 相关阅读:
    【POJ 1742】Coins【DP】【多重背包】
    【POJ 1742】Coins【DP】【多重背包】
    【洛谷P1352】没有上司的舞会【树形DP】
    【洛谷P1352】没有上司的舞会【树形DP】
    数据结构实验之栈三:后缀式求值
    数据结构实验之栈三:后缀式求值
    数据结构实验之栈二:一般算术表达式转换成后缀式
    数据结构实验之栈二:一般算术表达式转换成后缀式
    数据结构实验之栈一:进制转换
    数据结构实验之栈一:进制转换
  • 原文地址:https://www.cnblogs.com/zcb123456789/p/11281118.html
Copyright © 2020-2023  润新知