时间复杂度问题
查看原帖
时间复杂度问题
456287
wuxingyuan楼主2023/4/2 15:12

麻烦大家看下,我这个解法应该是 O(nlogn) 的,但是T了两个点,只有80,很麻。。不知道是哪里导致超时的。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=(1e6)+5000;
const int N=(1e6)+500;
int prime[maxn];
bool isprime[maxn];
int cnt=0;
void euler(){
	for(int i=1;i<=N;i++)isprime[i]=true;
	isprime[1]=false;
	for(int i=2;i<=N;i++){
		if(isprime[i])prime[++cnt]=i;
		for(int j=1;j<=cnt&&prime[j]*i<=N;j++){
			isprime[prime[j]*i]=false;
			if(i%prime[j]==0)break;
		}
	}
}
int fm(int n){
	for(int i=1;prime[i]<=n;i++){
		while(n%prime[i]==0)n/=prime[i];
		if(n==1)return prime[i];
	}
}
int main(){
	int n;
	cin>>n;
	euler();
	int p=fm(n);
	if(n==p){
		cout<<"-1"<<endl;
		return 0;
	}
	int ans=1e8;
	for(int h=n-p+1;h<n;h++){
		int m=fm(h);
		if(m==h)continue;
		ans=min(ans,h-m+1);
	}
	if(ans==1e8)ans=-1;
	cout<<ans<<endl;
	return 0;
}
2023/4/2 15:12
加载中...