思路
打素数表 for 遍历x1(即p2+1) :x2-x2的最大质因数+1~x2 if i不是素数 x0=min(x0,x1-x1的最大质因数+1) else x0=min(x0,x1);
代码:
#include <bits/stdc++.h> using namespace std; const int N=1e6+5; int prime[N],cnt,fct[N]; bool st[N]; int ans,x0; int main(int argc, char** argv) { cin>>x0; for(int i=2;i<=x0;i++){ if(!st[i]) prime[cnt++]=i, fct[i]=i; for(int j=0;prime[j]<=x0/i;j++){ st[prime[j]*i]=true; fct[i*prime[j]]=fct[i]; if(i%prime[j]==0) break; } } ans=x0; for(int i=x0-fct[x0]+1;i<=x0;i++){ if(st[i]) ans=min(ans,i-fct[i]+1); else ans=min(ans,i); } cout<<ans<<endl; return 0; }