solution 1
看到题目,我是一开始想(我太弱了)先预处理出 2 ∼ p 2\sim p 2∼p 的倍数中所有 ⩽ y \leqslant \text{y} ⩽y 的数,但时间复杂度是 O ( p y ) \mathcal O (py) O(py),最差 O ( ( 1 0 9 ) 2 ) = O ( 1 0 18 ) \mathcal O ((10^9)^2) = \mathcal O (10^{18}) O((109)2)=O(1018) 明显超时。。。
for(int i=2;i<p;i++){
for(int j=i;j<y;j+=i){
num[j]=1;
}
}
solution 2
前置芝士
求 x 是否是质数:
定义 n = ⌊ x ⌋ n = \left \lfloor \sqrt{x}\right\rfloor n=⌊x⌋
则如果在 [ 2 , n ] \left[2,n\right] [2,n] 中没有 n n n 的因数 [ 2 , x ] \left[2,x\right] [2,x] 2 2 2 到 x x x 中没有 x x x 的因数。
证明:由于一个数的因数是对应的,
若 a ∣ n a \mid n a∣n 则 ( n ÷ a ) ∣ n (n \div a)\mid n (n÷a)∣n。
所以若 [ 2 , n ] \left[2,n\right] [2,n] 没有其因数,它就是素数,证毕。
思路
根据前置芝士,我们可以推断出若 [ 2 , y ] [2,\sqrt{y}] [2,y]中没有 [ 2 , p ] [2,p] [2,p]的任意一个数的倍数,则 [ 2 , y ] [2,y] [2,y]中没有 [ 2 , p ] [2,p] [2,p]的任意一个数的倍数。
code
int p,y;
cin>>p>>y;
bool a=0;
for(int i=y;i>p;i--){
a=0;
for(int j=2;j<=sqrt(i)&&j<=p;j++){
if(i%j==0){
a=1;
break;
}
}
if(!a){
cout<<i<<endl;
return 0;
}
}
cout<<-1;
the end.