解题思路:已知Xi,那么想要使得Xi-1尽量小,p的取值必然是Xi的最大质因数,为啥呢,设当前选取的Xi的质因子是p1,那么Xi-1的取值范围就必然是Xi-p1+1 ~ Xi,所以p1越大可取值越小,所以只要算Xi的所以质因子,就可以判断Xi-1的最小取值了。时间复杂度为O(nsqrt(n))
#include<bits/stdc++.h>
using namespace std;
const int mx = 1e6 + 10;
int n,m;
int pri[mx],top;
bool vis[mx];
void init()
{
top = 0;
for(int i=2;i<mx;i++){
if(!vis[i]) pri[top++] = i;
for(int j=0;j<top&&pri[j]*i<mx;j++)
{
vis[pri[j]*i] = 1;
if(i%pri[j]==0) break;
}
}
}
int main()
{
init();
scanf("%d",&n);
m = n;
int num,ans = 1e9;
for(int j=0;pri[j]*pri[j]<=m;j++)
{
if(m%pri[j]==0) num = pri[j];
while(m%pri[j]==0) m /= pri[j];
}
if(m!=1) num = m;
m = n - num + 1;
for(int i=m;i<=n;i++){
if(!vis[i]) continue;
m = i;
for(int j=0;pri[j]*pri[j]<=m;j++)
{
if(m%pri[j]==0) num = pri[j];
while(m%pri[j]==0) m /= pri[j];
}
if(m!=1) num = m;
ans = min(ans,max(i-num+1,3));
}
printf("%d\n",ans);
return 0;
}