結果
問題 | No.936 Are |
ユーザー | ygussany |
提出日時 | 2020-10-20 21:05:10 |
言語 | C (gcc 12.3.0) |
結果 |
AC
|
実行時間 | 216 ms / 3,000 ms |
コード長 | 3,982 bytes |
コンパイル時間 | 450 ms |
コンパイル使用メモリ | 35,968 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-07-21 08:29:21 |
合計ジャッジ時間 | 3,310 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 207 ms
5,376 KB |
testcase_02 | AC | 208 ms
5,376 KB |
testcase_03 | AC | 2 ms
5,376 KB |
testcase_04 | AC | 2 ms
5,376 KB |
testcase_05 | AC | 1 ms
5,376 KB |
testcase_06 | AC | 2 ms
5,376 KB |
testcase_07 | AC | 1 ms
5,376 KB |
testcase_08 | AC | 1 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 | 1 ms
5,376 KB |
testcase_13 | AC | 57 ms
5,376 KB |
testcase_14 | AC | 168 ms
5,376 KB |
testcase_15 | AC | 66 ms
5,376 KB |
testcase_16 | AC | 120 ms
5,376 KB |
testcase_17 | AC | 107 ms
5,376 KB |
testcase_18 | AC | 45 ms
5,376 KB |
testcase_19 | AC | 197 ms
5,376 KB |
testcase_20 | AC | 200 ms
5,376 KB |
testcase_21 | AC | 179 ms
5,376 KB |
testcase_22 | AC | 124 ms
5,376 KB |
testcase_23 | AC | 216 ms
5,376 KB |
testcase_24 | AC | 205 ms
5,376 KB |
ソースコード
#include <stdio.h> #define Vert(h, i, j, k, l) ((h) * 625 + (i) * 125 + (j) * 25 + (k) * 5 + (l)) const int Mod = 1000000007; typedef struct List { struct List *next; int v; } list; int main() { int N, K, L[2], R[2]; scanf("%d %d", &N, &K); scanf("%d %d %d %d", &(L[0]), &(R[0]), &(L[1]), &(R[1])); int g, h, i, j, k, l, m = 0, flag, u, w; list *adj[1250] = {}, e[6000], *p, *q; for (i = 0; i <= 4; i++) { for (j = 0; j <= 4; j++) { if (i + j == 0) continue; for (k = 0; k <= 4; k++) { for (l = 0; l <= 4; l++) { if (k + l == 0) continue; u = Vert(0, i, j, k, l); if (i + j > 1) { for (g = 0; g <= 4; g++) { if (g > i + j) break; h = (i + j - g) % 5; if (g + h > 0 && g != i && h != i) { e[m].v = Vert(1, g, h, k, l); e[m].next = adj[u]; adj[u] = &(e[m++]); } } } if (i != 0) { if (k != 0) { g = (k + i) % 5; e[m].v = Vert(1, i, j, g, l); e[m].next = adj[u]; adj[u] = &(e[m++]); } if (l != 0) { h = (l + i) % 5; e[m].v = Vert(1, i, j, k, h); e[m].next = adj[u]; adj[u] = &(e[m++]); } } if (j != 0) { if (k != 0) { g = (k + j) % 5; e[m].v = Vert(1, i, j, g, l); e[m].next = adj[u]; adj[u] = &(e[m++]); } if (l != 0) { h = (l + j) % 5; e[m].v = Vert(1, i, j, k, h); e[m].next = adj[u]; adj[u] = &(e[m++]); } } } } } } for (i = 0; i <= 4; i++) { for (j = 0; j <= 4; j++) { if (i + j == 0) continue; for (k = 0; k <= 4; k++) { for (l = 0; l <= 4; l++) { if (k + l == 0) continue; u = Vert(1, i, j, k, l); if (k + l > 1) { for (g = 0; g <= 4; g++) { if (g > k + l) break; h = (k + l - g) % 5; if (g + h > 0 && g != k && h != k) { e[m].v = Vert(0, i, j, g, h); e[m].next = adj[u]; adj[u] = &(e[m++]); } } } if (k != 0) { if (i != 0) { g = (i + k) % 5; e[m].v = Vert(0, g, j, k, l); e[m].next = adj[u]; adj[u] = &(e[m++]); } if (j != 0) { h = (j + k) % 5; e[m].v = Vert(0, i, h, k, l); e[m].next = adj[u]; adj[u] = &(e[m++]); } } if (l != 0) { if (i != 0) { g = (i + l) % 5; e[m].v = Vert(0, g, j, k, l); e[m].next = adj[u]; adj[u] = &(e[m++]); } if (j != 0) { h = (j + l) % 5; e[m].v = Vert(0, i, h, k, l); e[m].next = adj[u]; adj[u] = &(e[m++]); } } for (p = adj[u]; p != NULL; p = p->next) if (p->v < 25) break; if (p != NULL) { for (p = adj[u]; p->next != NULL; ) { if (p->next->v >= 25) p->next = p->next->next; else p = p->next; } if (adj[u]->v >= 25) adj[u] = adj[u]->next; } flag = 0; for (p = adj[u]; p != NULL; p = p->next) { w = p->v; for (q = adj[w]; q != NULL; q = q->next) if (q->v % 25 == 0) break; if (q == NULL) flag |= 1; else flag |= 2; } if (flag == 3) { for (p = adj[u]; p->next != NULL; ) { w = p->next->v; for (q = adj[w]; q != NULL; q = q->next) if (q->v % 25 == 0) break; if (q != NULL) p->next = p->next->next; else p = p->next; } w = adj[u]->v; for (q = adj[w]; q != NULL; q = q->next) if (q->v % 25 == 0) break; if (q != NULL) adj[u] = adj[u]->next; } } } } } long long dp[2][1250] = {}, ans = 0; dp[0][Vert(N, L[0], R[0], L[1], R[1])] = 1; for (k = 1; k <= K; k++) { i = k % 2; j = 1 - i; for (u = 0; u < 1250; u++) dp[i][u] = 0; for (u = 0; u < 1250; u++) { for (p = adj[u]; p != NULL; p = p->next) dp[i][p->v] += dp[j][u]; } for (u = 0; u < 1250; u++) dp[i][u] %= Mod; for (u = 625; u < 1250; u += 25) ans += dp[i][u]; } printf("%lld\n", ans % Mod); fflush(stdout); return 0; }