CodeForces 947A/948B - Primal Sport
思路
注意:时间超时,优化算法
转化:在低复杂度下,求数字质因数分解中的最大的质数
算法:nlgn 10^6 素数打表 , 过程中保存最大的质数
代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int dp[N],max_prime[N];
void build_prime(int n){
int m=sqrt(n)+0.5;
for (int i=2;i<=n;i++) dp[i]=i;
for (int i=2;i<=m;i++) if (dp[i]==i){
for (int j=i;j<=n;j+=i){
while (dp[j]%i==0){
dp[j]/=i;
}
max_prime[j]=i;
}
}
}
int get_maxprime(int n){
if (dp[n]==1) return max_prime[n];
else return dp[n];
}
int main(){
build_prime(N);
int n;
cin>>n;
int maxprime1=get_maxprime(n);
int ans=n;
for (int i=n-maxprime1+1;i<=n;i++){
int maxprime2=get_maxprime(i);
ans=min(ans,max(i-maxprime2+1,maxprime2+1));
}
cout<<ans<<endl;
}