游戏(素数判断)
考试的时候写T了。。。。不好意思贴自己的代码了,看std十分优美,就加了注释贴上来了qwq
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define per(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)
const int maxn=1e6+5;
int n,mini,tot;
int p[maxn],vis[maxn],maxi[maxn];
void getp(){
rep(i,2,n){
if(!vis[i])p[++tot]=i;
rep(j,1,tot){
if(p[j]*i>n)break;
vis[i*p[j]]=1;
if(i%p[j]==0)break;
}
}
}
//用线性筛会更快一点qwq 但是这个的时间复杂度已经很优秀了
//这个是对素数的预处理
int main(){
cin>>n;
getp();
rep(i,1,tot)
for(int j=p[i];j<=n;j+=p[i])
maxi[j]=max(maxi[j],p[i]);
//寻找h2的质因子里面的最大的
//因为我们要找的是[h2-质因子+1,h2]这个范围内的合法数(质数不合法)来当作h1
//所以显然最大的质因子来找是最优秀的
//因为它会把小的也覆盖掉qwq
//因为h2大于等于h1,h0,所以顺便一起处理出来了他们的最大的质因子
int ans=n;
per(i,n,n-maxi[n]+1)
//其实正着写也无所谓qwq
if(i!=maxi[i])
ans=min(ans,i-maxi[i]+1);
//推导两遍即可
cout<<ans<<endl;
return 0;
}