定義反哥德巴赫分拆數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;
}