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 }