結果
| 問題 |
No.936 Are
|
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2020-10-20 21:05:10 |
| 言語 | C (gcc 13.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 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 25 |
ソースコード
#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;
}