結果
問題 | No.6 使いものにならないハッシュ |
ユーザー | bal4u |
提出日時 | 2019-04-07 20:28:52 |
言語 | C (gcc 12.3.0) |
結果 |
AC
|
実行時間 | 3 ms / 5,000 ms |
コード長 | 1,328 bytes |
コンパイル時間 | 1,286 ms |
コンパイル使用メモリ | 29,696 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-09-16 16:49:10 |
合計ジャッジ時間 | 1,785 ms |
ジャッジサーバーID (参考情報) |
judge6 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 3 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 2 ms
5,376 KB |
testcase_04 | AC | 2 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 2 ms
5,376 KB |
testcase_07 | AC | 2 ms
5,376 KB |
testcase_08 | AC | 2 ms
5,376 KB |
testcase_09 | AC | 2 ms
5,376 KB |
testcase_10 | AC | 2 ms
5,376 KB |
testcase_11 | AC | 2 ms
5,376 KB |
testcase_12 | AC | 2 ms
5,376 KB |
testcase_13 | AC | 2 ms
5,376 KB |
testcase_14 | AC | 2 ms
5,376 KB |
testcase_15 | AC | 2 ms
5,376 KB |
testcase_16 | AC | 2 ms
5,376 KB |
testcase_17 | AC | 2 ms
5,376 KB |
testcase_18 | AC | 2 ms
5,376 KB |
testcase_19 | AC | 2 ms
5,376 KB |
testcase_20 | AC | 2 ms
5,376 KB |
testcase_21 | AC | 2 ms
5,376 KB |
testcase_22 | AC | 2 ms
5,376 KB |
testcase_23 | AC | 2 ms
5,376 KB |
testcase_24 | AC | 2 ms
5,376 KB |
testcase_25 | AC | 2 ms
5,376 KB |
testcase_26 | AC | 2 ms
5,376 KB |
testcase_27 | AC | 3 ms
5,376 KB |
testcase_28 | AC | 3 ms
5,376 KB |
testcase_29 | AC | 2 ms
5,376 KB |
testcase_30 | AC | 2 ms
5,376 KB |
testcase_31 | AC | 2 ms
5,376 KB |
ソースコード
// yukicoder: No.6 使いものにならないハッシュ // 2019.4.7 bal4u // 素数表、バカ計算 #include <stdio.h> #include <string.h> #define MAX 200002 #define SQRT 447 char notPrime[MAX] = { 1,1,0,0,1 }; // zero: if prime int ptbl[18000] = { 2, 3, 5, 7, 11, 13 }; int sz; // 17984 char a[18000]; typedef struct { int fr, to; char n; } T; T t[18000]; void sieve() { int i, j; for (i = 3; i <= SQRT; i += 2) { if (!notPrime[i]) { for (j = i * i; j < MAX; j += i) notPrime[j] = 1; } } sz = 1; for (i = 3; i <= MAX; i += 2) if (!notPrime[i]) ptbl[sz++] = i; } int calc(int n) { int s; if (n < 10) return n; s = 0; while (n) s += n % 10, n /= 10; return calc(s); } int upper_bound(int x) { int m, l = 0, r = sz; while (l < r) { m = (l + r) >> 1; if (ptbl[m] <= x) l = m + 1; else r = m; } return l - 1; } int getLen(int fr, int tid) { int i, j, ans, len; char f[10]; len = ans = 0; for (i = tid; ptbl[i] >= fr; i--) { memset(f, 0, 10); f[a[i]] = 1; for (j = i - 1; ptbl[j] >= fr; j--) { if (f[a[j]]) break; f[a[j]] = 1; } if (i - j > len) len = i - j, ans = ptbl[j + 1]; } return ans; } int main() { int i, k, K, N; sieve(); for (i = 0; i < sz; i++) a[i] = calc(ptbl[i]); scanf("%d%d", &K, &N); k = upper_bound(N); printf("%d\n", getLen(K, k)); return 0; }