TLE+WA
#include <bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int N = 15, mod = 3e5 + 7, P = 1e9 + 7;
int n, a[N];
int now[N];
int Map[N][500005];
int pw[N], cnt, mu, base = 28;
int b[2][460];
int res = 0, sx, sy, sum;
int dfs (int x, int fig, int num)
{
if (fig == n * (n - 1) / 2 + 1 && num == mu) return 1;
if (now[x] + 3 * (n - x + 1) < a[x]) return 0;//全胜利都无法达到目标
if (b[0][fig] == x && b[1][fig] == x + 1)//记忆化
if (Map[n - x + 1][num] != -1)
{ return Map[n - x + 1][num]; }
int xd = b[0][fig], yd = b[1][fig];
int res = 0;//搜索状态
if (now[xd] + 3 <= a[xd] && sx)
{
now[xd] += 3; sx --;
(res += dfs (yd == n ? xd + 1 : xd, fig + 1, (num + 3 * pw[xd]) % mod)) %= P;
now[xd] -= 3; sx ++;
}
if (now[xd] < a[xd] && now[yd] < a[yd] && sy)
{
now[xd] ++, now[yd] ++; sy --;
(res += dfs (yd == n ? xd + 1 : xd, fig + 1, (num + pw[xd] + pw[yd]) % mod)) %= P;
now[xd] --, now[yd] --; sy ++;
}
if (now[yd] + 3 <= a[yd] && sx)
{
now[yd] += 3; sx --;
(res += dfs (yd == n ? xd + 1 : xd, fig + 1, (num + 3 * pw[yd]) % mod)) %= P;
now[yd] -= 3; sx ++;
}
if (yd == x + 1)Map[n - x + 1][num] = res % P;//更新
return res;
}
signed main ()
{
memset (Map, -1, sizeof Map);
scanf ("%d", &n);
pw[n] = 1;
for (int i = n - 1; i >= 1; i --) pw[i] = pw[i + 1] * base % mod;
for (int i = 1; i <= n; i ++)
for (int j = i + 1; j <= n; j ++)
b[0][++ cnt] = i, b[1][cnt] = j;//比赛顺序
for (int i = 1; i <= n; i ++) scanf ("%d", a + i), sum += a[i];//总共得分
sort (a + 1, a + n + 1);
for (int i = 1; i <= n; i ++) (mu += a[i] * pw[i]) %= mod;
sx = sum - n * n + n, sy = (sum - 3 * sx) >> 1;//解方程
printf ("%d\n", dfs (1, 1, 0));
}
被帖子里的hack数据hack了
10
17 8 3 15 9 12 13 10 12 16