【HDOJ6623】Minimal Power of Prime(Powerful Number)

题意:给定大整数n,求其质因数分解的最小质数幂

n<=1e18

思路:常规分解算法肯定不行

考虑答案大于1的情况只有3种:质数的完全平方,质数的完全立方,以及p^2*q^3,p,q>=1三种形式

前两种可以暴力判

第三种必定有一个小于10^(18/5)的因子,大概是3800

迭代分解,用vector存一下具体的情况

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long ll;
  4 typedef unsigned int uint;
  5 typedef unsigned long long ull;
  6 typedef pair<int,int> PII;
  7 typedef pair<ll,ll> Pll;
  8 typedef vector<int> VI;
  9 typedef vector<PII> VII;
 10 //typedef pair<ll,ll>P;
 11 #define N  1000010
 12 #define M  200010
 13 #define fi first
 14 #define se second
 15 #define MP make_pair
 16 #define pb push_back
 17 #define pi acos(-1)
 18 #define mem(a,b) memset(a,b,sizeof(a))
 19 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
 20 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
 21 #define lowbit(x) x&(-x)
 22 #define Rand (rand()*(1<<16)+rand())
 23 #define id(x) ((x)<=B?(x):m-n/(x)+1)
 24 #define ls p<<1
 25 #define rs p<<1|1
 26 
 27 const int MOD=1e9+7,inv2=(MOD+1)/2;
 28       double eps=1e-4;
 29       int INF=1e9;
 30       int inf=0x7fffffff;
 31       int dx[4]={-1,1,0,0};
 32       int dy[4]={0,0,-1,1};
 33 
 34 ll p[100000],mn[100000];
 35 
 36 int read()
 37 {
 38    int v=0,f=1;
 39    char c=getchar();
 40    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
 41    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
 42    return v*f;
 43 }
 44 
 45 ll check2(ll n)
 46 {
 47     ll t=sqrt(n);
 48     if(t*t==n) return t;
 49     return 0;
 50 }
 51 
 52 ll check3(ll n)
 53 {
 54     ll t=pow(n,1.0/3)+0.5;
 55     if(t*t*t==n) return t;
 56     return 0;
 57 }
 58 
 59 VII solve(ll n)
 60 {
 61     if(n<100000000)
 62     {
 63         VII re;
 64         for(int i=1;i<=p[0]&&p[i]*p[i]<=n;i++)
 65          if(n%p[i]==0)
 66          {
 67              int s=0;
 68              while(n%p[i]==0)
 69              {
 70                  s++;
 71                  n/=p[i];
 72              }
 73              re.push_back(MP(p[i],s));
 74          }
 75         if(n>1) re.push_back(MP(n,1));
 76         return re;
 77     }
 78     int t;
 79     if(t=check2(n))
 80     {
 81         VII re=solve(t);
 82         for(int i=0;i<re.size();i++) re[i].se*=2;
 83         return re;
 84     }
 85     if(t=check3(n))
 86     {
 87         VII re=solve(t);
 88         for(int i=0;i<re.size();i++) re[i].se*=3;
 89         return re;
 90     }
 91     ll t1=0,t2=0;
 92     for(int i=1;i<=p[0]&&p[i]*p[i]*p[i]*p[i]*p[i]<=n;i++)
 93      if(n%p[i]==0)
 94      {
 95          t1=p[i];
 96          while(n%p[i]==0)
 97          {
 98              t2++;
 99              n/=p[i];
100          }
101          break;
102      }
103     if(t1==0) return VII(1,MP(0,1));
104     VII re=solve(n);
105     re.push_back(MP(t1,t2));
106     return re;
107 }
108 
109 
110 int main()
111 {
112     //freopen("1.in","r",stdin);
113     //freopen("1.out","w",stdout);
114     rep(i,2,10000)
115     {
116          if(!mn[i])
117          {
118              p[++p[0]]=i;
119              mn[i]=p[0];
120         }
121         for(int j=1;j<=mn[i]&&i*p[j]<=10000;j++) mn[i*p[j]]=j;
122     }
123     int cas=read();
124     while(cas--)
125     {
126         ll n;
127         scanf("%I64d",&n);
128         VII t=solve(n);
129         if(t.empty()) printf("1\n");
130          else
131          {
132              int ans=100000;
133              for(int i=0;i<t.size();i++) ans=min(ans,t[i].se);
134              printf("%d\n",ans);
135          }
136     }
137 
138     return 0;
139 }

 

posted on 2019-10-09 21:54  myx12345  阅读(199)  评论(0编辑  收藏  举报

导航