#include #define Vert(h, i, j, k, l) ((h) * 5000 + (i) * 1000 + (j) * 100 + (k) * 10 + (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[10000] = {}, e[20000], *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 < 100) break; if (p != NULL) { for (p = adj[u]; p->next != NULL; ) { if (p->next->v >= 100) p->next = p->next->next; else p = p->next; } if (adj[u]->v >= 100) 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 % 100 == 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 % 100 == 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 % 100 == 0) break; if (q != NULL) adj[u] = adj[u]->next; } } } } } long long dp[2][10000] = {}, 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 < 10000; u++) dp[i][u] = 0; for (u = 0; u < 10000; u++) { for (p = adj[u]; p != NULL; p = p->next) dp[i][p->v] += dp[j][u]; } for (u = 0; u < 10000; u++) dp[i][u] %= Mod; for (u = 5000; u < 10000; u += 100) ans += dp[i][u]; } printf("%lld\n", ans % Mod); fflush(stdout); return 0; }