結果
| 問題 |
No.458 異なる素数の和
|
| コンテスト | |
| ユーザー |
bal4u
|
| 提出日時 | 2019-04-24 08:08:58 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 49 ms / 2,000 ms |
| コード長 | 847 bytes |
| コンパイル時間 | 1,039 ms |
| コンパイル使用メモリ | 31,616 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-07 04:44:15 |
| 合計ジャッジ時間 | 1,477 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
// 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; j < sz && (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