•题意
给你一个大于 1 的正整数 n;
它可以分解成不同的质因子的幂的乘积的形式,问这些质因子的幂中,最小的幂是多少。
•题解
定义 $ans$ 表示最终答案;
①如果 $ans \ge 5$:
那么,肯定有 $n=p^{ans}\ ,\ p \le \sqrt[{ans}]{n}$,也就是说 $\ p \le 10^{\frac{18}{5}}$;
所以,我们可以提前预处理出 $[1,10000]$ 的素数表
•Code
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define mem(a,b) memset(a,b,sizeof(a)) 5 const int N=1e4; 6 7 ll n; 8 int cnt; 9 int prime[N]; 10 bool isPrime[N+50]; 11 12 void Prime() 13 { 14 cnt=0; 15 mem(isPrime,true); 16 isPrime[1]=false; 17 18 for(int i=2;i <= N;++i) 19 { 20 if(isPrime[i]) 21 prime[++cnt]=i; 22 23 int x; 24 for(int j=1;j <= cnt && (x=i*prime[j]) <= N;++j) 25 { 26 isPrime[x]=false; 27 28 if(i%prime[j] == 0) 29 break; 30 } 31 } 32 } 33 bool Calc(ll x) 34 { 35 int l=1,r=(int)1e6+1; 36 while(r-l > 1) 37 { 38 ll mid=l+((r-l)>>1); 39 if(mid*mid*mid > x) 40 r=mid; 41 else 42 l=mid; 43 44 if(mid*mid*mid == x) 45 return true; 46 } 47 return false; 48 } 49 int Solve() 50 { 51 int ans=100; 52 for(int i=1;i <= cnt;++i) 53 { 54 int k=0; 55 while(n%prime[i] == 0) 56 { 57 k++; 58 n /= prime[i]; 59 } 60 if(k) 61 ans=min(ans,k); 62 63 if(n == 1 || ans == 1) 64 return ans; 65 } 66 67 ll x=sqrt(sqrt(n)); 68 ll y=sqrt(n); 69 70 if(x*x*x*x == n) 71 ans=min(ans,4); 72 else if(y*y == n) 73 ans=min(ans,2); 74 else if(Calc(n)) 75 ans=min(ans,3); 76 else 77 ans=1; 78 79 return ans; 80 } 81 int main() 82 { 83 Prime(); 84 85 int T; 86 scanf("%d",&T); 87 while(T--) 88 { 89 scanf("%lld",&n); 90 printf("%d\n",Solve()); 91 } 92 return 0; 93 }
原文地址:https://www.cnblogs.com/violet-acmer/p/11708166.html
时间: 2024-10-08 21:05:47