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\n",mi);
              }
        }
return 0;
}

 

posted @ 2019-08-01 10:50  ~zcb  阅读(171)  评论(0编辑  收藏  举报