2019hdu多校 Minimal Power of Prime

题目链接:Click here

题目大意:求一个数分解质因数后的最小幂指数

Solution:

首先,我们肯定是不能直接暴力求解的

我们先考虑筛出1e4范围以内的所有质数,把x所有这个范围内的质因子筛掉

那么现在它的数值范围就变成了1e14了,考虑此时他还存在没有被筛掉的质因子的情况

因为我们已经筛掉了1e4以内的质数,所以此时它的质因子的大小是大于1e4的,那么它的指数大小最大为4

我们可以直接对此时的x开根来判断指数是否为2、4,对于指数为3的情况我们则二分判断,若都不满足,则他为质数

Code:

#include<bits/stdc++.h>
#define int unsigned long long 
using namespace std;
const int N=1e4+1;
int n,tot,ans;
int prime[N],isprime[N];
int min(int a,int b){return a<b?a:b;}
int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void prepare(){
	for(int i=2;i<=N;i++){
		if(!isprime[i]) prime[++tot]=i;
		for(int j=1;j<=tot&&prime[j]*i<=N;j++){
			isprime[prime[j]*i]=1;
			if(i%prime[j]==0) break;
		}
	}
}
int calc(int x){return x*1ll*x*1ll*x;}
int find(){
	int l=N,r=N*100;
	while(l<=r){
		int mid=l+r>>1,x=calc(mid);
		if(x<n) l=mid+1;
		if(x>n) r=mid-1;
		if(x==n) return 1;
	}return 0;
}
void solve(){
	n=read(),ans=60;
	for(int i=1;i<=tot&&prime[i]<=n;i++){
		if(n%prime[i]==0){int t=0;
			while(n%prime[i]==0){
				n/=prime[i];
				++t;
			}ans=min(ans,t);
		}
	}if(n==1) return printf("%lld\n",ans),void();
	int u1=sqrt(n),u2=sqrt(u1),flag=0;
	if(u2*u2*u2*u2==n) ans=min(ans,4),flag=1;
	else if(u1*u1==n) ans=min(ans,2),flag=1;
	if(find()) ans=min(ans,3),flag=1;
	if(!flag) ans=1;
    printf("%lld\n",ans);
}
signed main(){
	prepare();
	int t=read();
	while(t--) solve();
	return 0;
}
posted @ 2019-08-01 15:49  DQY_dqy  阅读(174)  评论(0编辑  收藏  举报