B 最小的指数

题意:给出一个1e18范围内的数,让我们对其尽心质因数分解;

   求出质因数的最小指数,如18分解后为2*3*3,那么有指数1(2的1次方),指数2(3的2次方)

思路:因为给出的数的范围有点大,所以想要直接进行暴力是不可能的;

   但是可以发现,当质数较大的时候,指数是很小的,如当某个数为1e4的时候,想要变成1e16也就需要4次方而已;  

   所以我们可以将质数较大的情况直接计算,当质数较小的时候,暴力枚举

   对于大的情况,从1e3开始的数,顶多指数最大就到5,所以我们可以枚举指数分别为1,2,3,4,5的情况(代码中只有到4)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 using namespace std;
 7 typedef long long ll;
 8 const int maxn=1e3+10;
 9 ll prime[maxn],len;
10 bool is_prime[maxn];
11 void init()
12 {
13     int i,j,k;
14     is_prime[0]=is_prime[1]=1;
15     for(i=2;i<maxn;i++){
16         if(!is_prime[i])
17             prime[++len]=i;
18         for(j=1;j<=len&&prime[j]*i<maxn;j++)
19         {
20             is_prime[prime[j]*i]=1;
21             if(i%prime[j]==0) break;
22         }
23     }
24 }
25 int main()
26 {
27     init();
28     int T;
29     cin>>T;
30     while(T--){
31         ll n;
32         scanf("%lld",&n);
33         if(n==1){
34             printf("0\n");
35             continue;
36         }
37         int i,j,k,ans=1e9+7;
38         for(i=1;i<=len;i++){
39             if(n<prime[i]) break;
40             int cnt=0;
41             while(n%prime[i]==0){
42                 cnt++;
43                 n/=prime[i];
44             }
45             if(cnt) ans=min(ans,cnt);
46         }
47         if(n>=maxn){
48             ll a2=sqrt(n);
49             ll a3=pow(1.0*n,1.0/3.0);
50             ll a4=sqrt(sqrt(n));
51             if(a4*a4*a4*a4==n) ans=min(ans,4);
52             else if(a3*a3*a3==n||(a3-1)*(a3-1)*(a3-1)==n||(a3+1)*(a3+1)*(a3+1)==n) ans=min(ans,3);
53             else if(a2*a2==n) ans=min(ans,2);
54             else ans=1;
55         }
56         printf("%d\n",ans);
57     }
58     return 0;
59 }
View Code

 

posted @ 2021-01-27 21:57  古比  阅读(274)  评论(0编辑  收藏  举报