游戏(素数判断)


考试的时候写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;
}
posted @ 2018-10-04 10:10  风浔凌  阅读(275)  评论(0编辑  收藏  举报