题解:P12157 [蓝桥杯 2025 省 Java B] 魔法科考试
china_history · · 题解
前置芝士 线性筛 本题精髓
//线性筛(前置芝士P3383)
void prime() {
for (int i = 2; i <= n + m; i++) {
if (!isp[i]) {
p[++cnt] = i;
}
for (int j = 1; j <= cnt && i * p[j] <= n + m; j++) {
isp[i * p[j]] = 1;
if (i % p[j] == 0) {
break;
}
}
}
}
题意
给你两个数组
思路
我们可以先筛小于
代码
#include <bits/stdc++.h>
using namespace std;
int n, m; //上半句与下半句的数量
int a[50005];//上半句
int b[50005];//下半句
int p[100001];//存质数
int cnt = 0;
int isp[100001];//质数判断
int vis[100001];//组合判重
int sum=0;//总数
void prime() {
for (int i = 2; i <= n + m; i++) { //只找n+m以下的质数(线性筛)(埃式筛也可以)
if (!isp[i]) {
p[++cnt] = i;
}
for (int j = 1; j <= cnt && i * p[j] <= n + m; j++) {//线性筛(前置芝士P3383)
isp[i * p[j]] = 1;
if (i % p[j] == 0) {
break;
}
}
}
}
int main() {
cin >> n >> m;
prime();//筛素数
for (int i = 1; i <= n; i++) {//输入前半句
cin >> a[i];
}
for (int i = 1; i <= m; i++) {//输入下半句
cin >> b[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){//三秒钟,暴力即可
int t=a[i]+b[j];//总和
if(isp[t]==0&&t<=n+m&&vis[t]==0){//判断是否符合条件
sum++;//增加
vis[t]=1; //标记
}
}
}
cout << sum;
return 0;//好习惯
}