专栏文章

题解:P12157 [蓝桥杯 2025 省 Java B] 魔法科考试

P12157题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipjugx5
此快照首次捕获于
2025/12/03 13:11
3 个月前
此快照最后确认于
2025/12/03 13:11
3 个月前
查看原文

思路

这道题的难点就是我们会不会用埃式筛判断 ss 是否是质数。

埃式筛

CPP
vector<bool>  init(int N){
    vector<bool> isPrime(N+5,true);
    isPrime[0] = isPrime[1] = false;   
    for (int p = 2; p * p <= N; p++) {
        if (isPrime[p]) {
            for (int i = p * p; i <= N; i += p) {
                isPrime[i] = false;
            }
        }
    }
    return isPrime;
}
已经知道那些数是质数了,下面的就简单了,遍历每个 aia_ibjb_j 判断 ss 是否是质数和满不满足 sn+ms \le n+m,最后用 set 记录并去重,输出 set 的长度就行了。

代码

CPP
#include<bits/stdc++.h>
using namespace std;
vector<bool>  init(int N){//埃式筛
    vector<bool> isPrime(N+5,true);
    isPrime[0] = isPrime[1] = false;   
    for (int p = 2; p * p <= N; p++) {
        if (isPrime[p]) {
            for (int i = p * p; i <= N; i += p) {
                isPrime[i] = false;
            }
        }
    }
    return isPrime;
}
int main(){
    int n,m;
    cin>>n>>m;
    vector<int> a(n),b(m);
    for(int i=0;i<n;i++) cin>>a[i];
    for(int i=0;i<m;i++) cin>>b[i];
    vector<bool> isprime=init(n+m);
    set<int> st;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(a[i]+b[j]<=n+m&&isprime[a[i]+b[j]]) st.insert(a[i]+b[j]);//判断。
        }
    }
    cout<<st.size();//st的长度。
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...