ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

# 牛客挑战赛46 B最小的指数

2020-12-14 16:02:43  阅读:197  来源: 互联网

标签:prime 46 ll 若为 最小 牛客 必为 挑战赛 include


牛客挑战赛46 B最小的指数

传送门

题意:1e6次询问,每次给你一个1e18的数问你质因数分解后的所有质因数中的指数幂中最小的是多少。

题解:将4000以下的素数预处理,然后分解n,若剩余值等于1说明已完全分解,若大于1,也易知其剩余最小质因数指数幂不超过4,便如下分类讨论。

1.若为4,则必为x^4==n;

2.若为3,则必为x^3==n;

3.若为2,则必为x2==n或(a*b)2==n;

4.否则为1。

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
const ll Maxn = 4e3;
ll prime[Maxn+7],t,n;
void solve() {
	memset(prime,0,sizeof(prime));
	for(int i = 2;i <= Maxn; i++) {
		if(!prime[i])prime[++prime[0]]=i;
		for(int j=1;j<=prime[0]&&prime[j]<=Maxn/i;j++){
			prime[prime[j]*i]=1;
			if(i%prime[j]==0)break;
		}
	}
}
int main(){
	solve();
	cin>>t;
	while(t--){
		scanf("%lld",&n);
		if(n==1){
			printf("0\n");
			continue;
		}
		ll ans=1e9,now;
		for(int i=1;i<=prime[0];i++){
			if(n%prime[i]==0){
				now=0;
				while(n%prime[i]==0){
					now++;
					n/=prime[i];
				}
				ans=min(ans,now);
			}
		}
		if(n!=1){
			ll lin4,lin3,lin2;
			lin2=(ll)sqrt(n);
			lin4=(ll)sqrt(lin2);
			lin3=(ll)(pow(n*1.0,1.0/3)+0.1);
			if(lin4*lin4*lin4*lin4==n){
				now=4;
			}
			else if(lin3*lin3*lin3==n){
				now=3;
			}
			else if(lin2*lin2==n){
				now=2;
			}
			else{
				now=1;
			}
			ans=min(now,ans);
		}
		printf("%lld\n",ans);
	}
}

标签:prime,46,ll,若为,最小,牛客,必为,挑战赛,include
来源: https://www.cnblogs.com/whitelily/p/14133739.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有