题意:输入n,求所有质因子幂的最小值。n奇大无比。
思路:先对n所有n开五次方根的质因子约完,然后如果没有除尽的话,因子最多也就4个了,所以幂数大于1的情况有p1^4,p1^3, p1^2 对于其他情况肯定有幂为1的。
然后注意一下精度问题。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #define ll long long using namespace std; int a[1000010]; int b[1000010]; ll qp(ll x, int y) { ll ans = 1; for(int i=1;i<=y;i++) ans*=x; return ans; } int main() { int t,k=0; for(int i=2;i<=1000000;i++) { if(b[i]==0) { a[k++]=i; for(int j=i+i;j<=1000000;j+=i) { b[j]=1; } } } while(~scanf("%d",&t)) { while(t--) { long long n; scanf("%lld",&n); int y=powl(n,1/5.0); // printf("y:%d ",y); int m=99999; for(int i=0;i<k;i++) { // printf("%d---- ",a[i]); if(a[i]>y) break; if(n%a[i]==0) { int r=0; while(1) { if(n%a[i]) { break; } n/=a[i]; r++; } m=min(m,r); } } //printf("%lld ",n); if(n!=1){ long long y4=powl(n,1/4.0); long long y3=powl(n,1/3.0); long long y2=powl(n,1/2.0); if(qp(y4,4)==n||qp(y4+1,4)==n||qp(y4-1,4)==n) { m=min(m,4); } else if(qp(y3,3)==n||qp(y3+1,3)==n||qp(y3-1,3)==n) { m=min(m,3); } else if(qp(y2,2)==n||qp(y2+1,2)==n||qp(y2-1,2)==n) { m=min(m,2); } else { m=min(m,1); } } printf("%d ",m); } } }