hihoCoder 1493 : 歌德巴赫猜想 素数筛法

时间:2023-05-02 22:50:25

题意:哥德巴赫猜想认为“每一个大于2的偶数,都能表示成两个质数之和”。给定一个大于2的偶数N,你能找到两个质数P和Q满足P<=Q并且P+Q=N吗?如果有多组解,输出P最小的一组。


思路:很简单的题,直接给区间的数打表,递增枚举,如果和都是素数直接输出即可。

AC代码

#include <cstdio>
#include <cmath>
#include <cctype>
#include <bitset>
#include <algorithm>
#include <cstring>
#include <utility>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
typedef long long LL;
const int maxn = 1000000 + 5;
int vis[maxn];
void init(int n) {
    int m = sqrt(n+0.5);
    memset(vis, 0, sizeof(vis));
    for(int i = 2; i <= m; ++i) if(!vis[i])
        for(int j = i*i; j <= n; j+=i) vis[j] = 1;
}
int main() {
    int n;
    while(scanf("%d", &n) == 1) {
        init(n);
        int p;
        for(int i = 2; i < n; ++i) {
            if(!vis[i] && !vis[n-i]) {
                p = i;
                break;
            }
        }
        printf("%d %d\n", p, n-p);
    }
    return 0;
}

当然,这题完全可以可以改一下:给定整数,输出所有区间内所有对,和满足和都是素数且,如果对于某个数有多组符合条件的对,输出最小的。输入有组数据,

如果暴力每个数的话,复杂度是,可能会超时,如果优化一下,只枚举素数的话,中又1000左右的素数,复杂度是(1000*n),打表针对多组数据也可能会超时。

我觉得更好的办法就是,两个for循环枚举素数和来凑n并打表,复杂度是1000*1000,是一种比较好的思路吧。

当然上述只是我做题时乱想的,大家看看就好。

如有不当之处欢迎指出!