結果

問題 No.458 異なる素数の和
ユーザー koyumeishi
提出日時 2016-12-09 02:04:59
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
RE  
実行時間 -
コード長 846 bytes
コンパイル時間 1,086 ms
コンパイル使用メモリ 31,104 KB
実行使用メモリ 6,824 KB
最終ジャッジ日時 2024-11-28 16:06:44
合計ジャッジ時間 3,402 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2 RE * 1
other AC * 16 RE * 12
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <cstdio>
#include <cassert>
using namespace std;

template<int N> struct unko{
    int p[N];
    int q[N];
    constexpr unko() : p(), q(){
      for(int i=2; i<N; i++) p[i] = true;
      for(long long i=2; i*i<N; i++){
        if(!p[i]) continue;
        for(long long j=i*i; j<N; j+=i){
          p[j] = false;
        }
      }
      int tail=0;
      for(int i=2; i<N; i++){
        if(p[i]) p[tail++] = i;
      }

      for(int i=1; i<N; i++) q[i] = -1;
      q[0] = 0;
      for(int i=0; i<tail; i++){
        for(int j=N-1-p[i]; j>=0; j--){
          if(q[j] == -1) continue;
          if(q[j+p[i]] < q[j]+1) q[j+p[i]] = q[j]+1;
        }
      }
    }
};



int main(){
  constexpr int sz = 2001;
  constexpr auto p = unko<sz>();
  int n;
  scanf("%d", &n);
  if(n<sz) printf("%d\n", p.q[n]);
  else assert(false);
  return 0;
}
0