zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    Java初学—类与对象
    linux dd命令测试U盘读写速度
    路由器的几种访问方式
    制作Linux启动盘并安装Linux系统到实体机
    RAID阵列与LVM逻辑卷组创建
    有关Linux下库的概念、生成和升级和使用等
    LInux中VIM的使用和定制
    如何通过mount命令挂载存储设备
    硬盘分区和系统启动
    RAID阵列与LVM逻辑卷组原理
  • 原文地址:https://www.cnblogs.com/zcb123456789/p/11281118.html
Copyright © 2011-2022 走看看