2025 暑假集训 Day12
2025.8.17
预估:\(100+100+40+0=240\),实际:\(100+10+20+0=130\)(其中那个 T1 的 No 写成 NO 本来是 0pts的但是也给算上了),难度大概是橙绿紫黑?
T1 质数
打个表可以发现,数越大,质数分布越稀疏。所以我们可以大胆地写一个暴力计算质数个数的程序,在时间限制快要超过的时候直接返回 No 就好了。然后你就会发现居然过了:
(赛时代码,注意这里的 NO 应该写成 No,T1 100pts是我自己加上去的实际应该是 0pts)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
constexpr int N=-1;
int l,k;
inline bool judge(int x)
{
if(x==1) return 0;
for(int i=2;i*i<=x;i++) if(x%i==0) return 0;
return 1;
}
int main()
{
freopen("prime.in","r",stdin);
freopen("prime.out","w",stdout);
cin>>l>>k;
int r=l+2*k,cnt=0;
for(int i=l;i<r;i++)
{
if(judge(i))
{
cnt++;
if(cnt>k) return 0&puts("Yes");
}
if(clock()*1.0/CLOCKS_PER_SEC>=0.9) return 0&puts("NO");
}
puts("NO");
return 0;
}
有没有不那么玄学的方法?考虑到 \(2\) 是唯一的偶质数,所以 \(\forall\) 大于 \(2\) 的偶数 \(x\) 都应该不是质数。这样只有在 \(l=2\) 时才有可能出现 Yes 的情况。打个表发现,Yes 的情况 \((l,k)\) 就只有三种:\((2,1),(2,2),(2,3)\)。对于这三种就直接输出 Yes,至于其他的 \((l,k)\),我们可以发现 \([l,l+2k)\) 最多只有 \(k\) 个质数,直接输出 No 就可以。

浙公网安备 33010602011771号