結果

問題 No.732 3PrimeCounting
ユーザー WarToks
提出日時 2018-09-17 16:39:07
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
TLE  
(最新)
AC  
(最初)
実行時間 -
コード長 1,013 bytes
コンパイル時間 1,621 ms
コンパイル使用メモリ 172,616 KB
実行使用メモリ 10,752 KB
最終ジャッジ日時 2024-07-18 07:45:57
合計ジャッジ時間 41,757 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 85 TLE * 3 -- * 1
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
using namespace std;

int main(){
  int n;
  scanf("%d",&n);
  vector<bool> isPrime(3 * n + 1,true);
  for(int i = 2;i <= 3 * n;i++){
    if(isPrime.at(i)){
      for(int j = 2 * i;j <= 3 * n;j += i){
        isPrime.at(j) = false;
      }
    }
  }
  vector <int> Primes;
  for(int i = 3;i <= n;i++){
    if(isPrime.at(i)){
      Primes.push_back(i);
    }
  }
  int size = Primes.size();
  vector <int> GET(2 * Primes.back() + 1,0);
  long long int ans = 0;
  long long int minus = 0;
  for(int i = 0;i < size - 1;i++){
    int U = Primes.at(i);
    for(int j = i + 1;j < size;j++){
      int V = Primes.at(j);
      GET.at(U + V)++;
      if(isPrime.at(U + 2 * V)) minus++;
      if(isPrime.at(2 * U + V)) minus++;
    }
  }

  for(int i = 0;i < size;i++){
    int U = Primes.at(i);
    for(int j = 4; j <= 2 * Primes.back();j +=2){
      if(isPrime.at(U + j) && GET.at(j) > 0){
        ans += GET.at(j);
      }
    }
  }
  ans = (ans - minus) / 3;
  cout << ans << endl;
  return 0;
}
0