結果
問題 | No.732 3PrimeCounting |
ユーザー |
|
提出日時 | 2019-05-16 18:07:52 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,544 ms / 3,000 ms |
コード長 | 1,260 bytes |
コンパイル時間 | 1,963 ms |
コンパイル使用メモリ | 174,724 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-09-17 05:38:56 |
合計ジャッジ時間 | 20,688 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 89 |
ソースコード
#include<bits/stdc++.h> using namespace std; vector<int> primes2(int N){ // returns a list of prime numbers up to N (including N). if (N == 1) return vector<int>{}; if (N == 2) return vector<int>{2}; if (N <= 4) return vector<int>{2, 3}; vector<bool> isPrime(N + 1, true); for (int p = 5, d = 2; p * p <= N; p += d, d = 6 - d){ if (isPrime[p]){ for (int q = p * p, delta = d; q <= N; q += delta * p, delta = 6 - delta){ isPrime[q] = false; } } } vector<int> primes = {2, 3}; for (int p = 5, d = 2; p <= N; p += d, d = 6 - d){ if (isPrime[p]) primes.push_back(p); } return primes; } int main(){ int N; cin >> N; vector<int> ps = primes2(3 * N); vector<int> ds((3 * N)/2 + 1, 0); for (auto p : ps) ds[p/2] = 1; vector<int> hps; for (int i = 1; ps[i] <= N; ++i){ hps.push_back(ps[i]/2); } vector<long long> ab(N, 0); long long cnt = 0; for (int i = 1; i < hps.size(); ++i){ for (int j = 1; j < hps[i] * 2; ++j){ if (ab[j] and ds[j + hps[i] + 1]) cnt += ab[j]; } for (int j = 0; j < i; ++j) ab[hps[j] + hps[i]] += 1LL; } cout << cnt << endl; return 0; }