题意: 假设当前的数是x[i],那么x[i+1]由质数p(p<x[i]) * k>=x[i] 其中取最小的 . 已知x2,求最小的x0
思路:对于质数,只能由质数本身转移过来; 否则可以由 [x-p[x]+1 , x]转移过来,
复杂度O(n*sqrt(n))
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX_N=1e6+6;
const int MOD=1e9+7;
const int INF=0x3f3f3f3f;
bool prime[MAX_N];
inline void init(){
for(int i=2;i<=1e6;i++) prime[i]=true;
for(int i=2;i<=1e6;i++){
if(prime[i]){
for(int j=i+i;j<=1e6;j+=i) prime[j]=false;
}
}
}
inline int cul(int x){
int ans=-1;
for(int i=2;i*i<=x;i++){
if(x%i==0){
if(prime[i]) ans=max(ans,i);
if(prime[x/i]) ans=max(ans,x/i);
}
}
return ans;
}
int main(void){
init();
int n;
cin >> n;
int l=n-cul(n)+1;
int ans=INF;
for(int x1=l;x1<=n;x1++){
if(!prime[x1])
ans=min(ans,x1-cul(x1)+1);
else ans=min(ans,x1);
}
cout << ans << endl;
return 0;
}