麻烦大家看下,我这个解法应该是 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;
}