湘潭邀請賽A

哥德巴赫猜想:
任一大於2的偶數,都可表示成兩個素數之和。
是世界上最著名的未解問題之一,但是下面的反哥德巴赫猜想:
任一大於11的奇數,都可表示成兩個合數之和。
確很容易證明。

定義反哥德巴赫分拆數g(n)表示將大於11的奇數n分解爲兩個合數之和的方案數。再定義sg(n)=sum({g(i) | i ≤ n}),即所有不大於n的奇數的反哥德巴赫分拆數之和。你的任務就是快速的計算給定n所對應的sg(n)。

Input

有大約100組測試數據。每組測試數據佔一行,包含唯一的一個正整數13 ≤ n ≤ 1000000。輸入以EOF結束。

Output

對於輸入n,輸出對應的sg(n)。

Sample Input

13
14
15

Sample Output

1
1
2
水題,代碼:
#include <cstdio>
#include <algorithm>

using namespace std;

const int MAXN = 1 << 20;

bool p[MAXN];
vector<int> odd, even;

int main() {
    for (int i = 2; i < MAXN; ++i) {
        if (!p[i]) {
            for (int j = i + i; j < MAXN; j += i) {
                p[j] = true;
            }
        } else if (i % 2 != 0) {
            odd.push_back(i);
        } else {
            even.push_back(i);
        }
    }

    int n;

    while (scanf("%d", &n) != EOF) {
        int i = 0, j = lower_bound(even.begin(), even.end(), n) - even.begin();
        long long m = 0;
        while (i < (int)odd.size() && j >= 0) {
            while (j >= 0 && odd[i] + even[j] > n) {
                --j;
            }
            ++i;
            m += j + 1;
        }
        printf("%lld\n", m);
    }

    return 0;
}


發佈了90 篇原創文章 · 獲贊 50 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章