結果
| 問題 |
No.458 異なる素数の和
|
| コンテスト | |
| ユーザー |
bal4u
|
| 提出日時 | 2019-04-24 07:59:17 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 837 bytes |
| コンパイル時間 | 1,306 ms |
| コンパイル使用メモリ | 31,488 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-07 04:23:10 |
| 合計ジャッジ時間 | 6,805 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | RE * 3 |
| other | AC * 1 RE * 27 |
ソースコード
// yukicoder: No.458 異なる素数の和
// 2019.4.23 bal4u
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX 20000
#define SQRT 141 // sqrt(MAX)
char prime[MAX+2] = {1,1,0,0,1,0,1,0,1,1,0}; // 0:素数
int tbl[2300], sz; // sz=2263
int a[MAX+2];
int b[MAX+2];
void sieve(int n)
{
int i, j, b;
b = (int)sqrt((double)n);
for (i = 3; i <= b; i += 2) {
for (j = i*i; j <= n; j += i) prime[j] = 1;
}
tbl[1] = 2, sz = 2;
for (i = 3; i <= n; i+=2) if (!prime[i]) tbl[sz++] = i;
}
int main()
{
int i, j, k, N;
scanf("%d", &N);
sieve(N);
a[N] = 1;
for (i = N; i >= 0; i--) if (a[i]) {
for (j = b[i]+1; (k = i-tbl[j]) >= 0; j++) {
if (a[i]+1 > a[k] || (a[i]+1 == a[k] && b[k] > j))
a[k] = a[i]+1, b[k] = j;
}
}
if (a[0]) printf("%d\n", a[0]-1);
else puts("-1");
return 0;
}
bal4u