Submission #76210913
Source Code Expand
Copy
#include <stdio.h>#include <string.h>int llen;char limit[16];int gen;int memo[16][2][2][2];int memo_gen[16][2][2][2];int calc(int pos, int sati, int canskip, int is16) {int ans = 0;int i;if (pos >= llen) return !canskip;if (memo_gen[pos][sati][canskip][is16] == gen) return memo[pos][sati][canskip][is16];if (canskip) ans += calc(pos + 1, 0, canskip, 0);for (i = 0; i < 31; i++) {int v = 1 << i;char delta[16];int vlen;if (v == 128 || (is16 && v == 4)) continue;vlen = snprintf(delta, sizeof(delta), "%d", v);if (pos + vlen <= llen) {int cres = sati ? strncmp(limit + pos, delta, vlen) : 0;if (!sati || cres >= 0) {ans += calc(pos + vlen, sati && cres == 0, 0, v == 16);}}}memo[pos][sati][canskip][is16] = ans;memo_gen[pos][sati][canskip][is16] = gen;return ans;}int main(void) {int N;int no = 0, yes = 1010101010;if (scanf("%d", &N) != 1) return 1;while (no + 1 < yes) {
#include <stdio.h>
#include <string.h>
int llen;
char limit[16];
int gen;
int memo[16][2][2][2];
int memo_gen[16][2][2][2];
int calc(int pos, int sati, int canskip, int is16) {
int ans = 0;
int i;
if (pos >= llen) return !canskip;
if (memo_gen[pos][sati][canskip][is16] == gen) return memo[pos][sati][canskip][is16];
if (canskip) ans += calc(pos + 1, 0, canskip, 0);
for (i = 0; i < 31; i++) {
int v = 1 << i;
char delta[16];
int vlen;
if (v == 128 || (is16 && v == 4)) continue;
vlen = snprintf(delta, sizeof(delta), "%d", v);
if (pos + vlen <= llen) {
int cres = sati ? strncmp(limit + pos, delta, vlen) : 0;
if (!sati || cres >= 0) {
ans += calc(pos + vlen, sati && cres == 0, 0, v == 16);
}
}
}
memo[pos][sati][canskip][is16] = ans;
memo_gen[pos][sati][canskip][is16] = gen;
return ans;
}
int main(void) {
int N;
int no = 0, yes = 1010101010;
if (scanf("%d", &N) != 1) return 1;
while (no + 1 < yes) {
int m = no + (yes - no) / 2;
llen = snprintf(limit, sizeof(limit), "%d", m);
gen++;
if (calc(0, 1, 1, 0) >= N) yes = m; else no = m;
}
printf("%d\n", yes);
return 0;
}
/*
指定の数以下の「良い整数」が N 個以上か?で二分探索
「良い整数」の数を数えるにあたり、「128」 は 1 と 2 と 8 で作れるので、除外
https://oeis.org/A381259
164 → 1 64 と 1 64 で 2 通り作れる
print("\n".join([str(1<<x) for x in range(32)]))
*/
Submission Info
| Submission Time | |
|---|---|
| Task | D - Concat Power of 2 |
| User | mikecat |
| Language | C23 (GCC 14.2.0) |
| Score | 400 |
| Code Size | 1507 Byte |
| Status | AC |
| Exec Time | 2 ms |
| Memory | 1664 KiB |
Judge Result
| Set Name | Sample | All | ||||
|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 400 / 400 | ||||
| Status |
|
|
| Set Name | Test Cases |
|---|---|
| Sample | 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt |
| All | 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 01_min_01.txt, 01_min_02.txt, 01_min_03.txt, 01_min_04.txt, 01_min_05.txt, 02_small_01.txt, 02_small_02.txt, 02_small_03.txt, 02_small_04.txt, 02_small_05.txt, 03_medium_01.txt, 03_medium_02.txt, 03_medium_03.txt, 03_medium_04.txt, 03_medium_05.txt, 04_large_01.txt, 04_large_02.txt, 04_large_03.txt, 04_large_04.txt, 04_large_05.txt, 05_max_01.txt, 05_max_02.txt, 05_max_03.txt, 05_max_04.txt, 05_max_05.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| 00_sample_01.txt | AC | 1 ms | 1624 KiB |
| 00_sample_02.txt | AC | 1 ms | 1552 KiB |
| 00_sample_03.txt | AC | 2 ms | 1652 KiB |
| 01_min_01.txt | AC | 1 ms | 1648 KiB |
| 01_min_02.txt | AC | 1 ms | 1568 KiB |
| 01_min_03.txt | AC | 1 ms | 1632 KiB |
| 01_min_04.txt | AC | 1 ms | 1620 KiB |
| 01_min_05.txt | AC | 1 ms | 1648 KiB |
| 02_small_01.txt | AC | 1 ms | 1568 KiB |
| 02_small_02.txt | AC | 1 ms | 1588 KiB |
| 02_small_03.txt | AC | 1 ms | 1624 KiB |
| 02_small_04.txt | AC | 1 ms | 1616 KiB |
| 02_small_05.txt | AC | 1 ms | 1624 KiB |
| 03_medium_01.txt | AC | 1 ms | 1552 KiB |
| 03_medium_02.txt | AC | 1 ms | 1648 KiB |
| 03_medium_03.txt | AC | 1 ms | 1652 KiB |
| 03_medium_04.txt | AC | 1 ms | 1632 KiB |
| 03_medium_05.txt | AC | 1 ms | 1504 KiB |
| 04_large_01.txt | AC | 1 ms | 1648 KiB |
| 04_large_02.txt | AC | 1 ms | 1468 KiB |
| 04_large_03.txt | AC | 1 ms | 1508 KiB |
| 04_large_04.txt | AC | 1 ms | 1624 KiB |
| 04_large_05.txt | AC | 1 ms | 1652 KiB |
| 05_max_01.txt | AC | 2 ms | 1588 KiB |
| 05_max_02.txt | AC | 1 ms | 1568 KiB |
| 05_max_03.txt | AC | 2 ms | 1664 KiB |
| 05_max_04.txt | AC | 1 ms | 1648 KiB |
| 05_max_05.txt | AC | 1 ms | 1652 KiB |