• 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
    ",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
    ",ans);
    }
    signed main(){
    	prepare();
    	int t=read();
    	while(t--) solve();
    	return 0;
    }
    
  • 相关阅读:
    2019春招面试题总结-03
    2019春招面试题总结-02
    2019春招面试题总结-01
    Node.js 全局对象
    Node.js 路由
    Node.js 函数
    Node.js 模块系统
    Node.js Stream(流)
    Node.js Buffer(缓冲区)
    Node.js EventEmitter
  • 原文地址:https://www.cnblogs.com/NLDQY/p/11283081.html
Copyright © 2020-2023  润新知