結果

提出番号 1451
提出者 square1001
言語 C++
提出日時 2018-08-04 12:34:17
問題名 (64)Or Plus Max 2
結果 TLE
点数 78%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 2ms 8080KB
2 AC 100% 2ms 8432KB
3 AC 100% 2ms 8720KB
4 AC 100% 2ms 8720KB
5 AC 100% 2ms 8672KB
6 AC 100% 2ms 8288KB
7 AC 100% 2ms 8000KB
8 AC 100% 2ms 8704KB
9 AC 100% 2ms 7520KB
10 AC 100% 2ms 8384KB
11 AC 100% 2ms 8176KB
12 AC 100% 2ms 8416KB
テストケース 結果 得点 実行時間 メモリ使用量
13 AC 100% 5ms 17408KB
14 AC 100% 5ms 16336KB
15 AC 100% 6ms 17408KB
16 AC 100% 5ms 15328KB
17 AC 100% 6ms 17424KB
18 AC 100% 4ms 13392KB
19 AC 100% 6ms 17424KB
20 AC 100% 6ms 17408KB
テストケース 結果 得点 実行時間 メモリ使用量
21 AC 100% 15ms 22816KB
22 AC 100% 262ms 32928KB
23 AC 100% 597ms 35968KB
24 AC 100% 747ms 48976KB
25 AC 100% 783ms 44544KB
26 AC 100% 162ms 24912KB
27 AC 100% 893ms 48976KB
28 AC 100% 27ms 14048KB
29 AC 100% 858ms 48976KB
30 AC 100% 862ms 48976KB
テストケース 結果 得点 実行時間 メモリ使用量
31 TLE 0% 18743ms 223152KB
32 TLE 0% 14857ms 154608KB
33 TLE 0% 20002ms 0KB
34 TLE 0% 18594ms 187248KB
35 TLE 0% 6388ms 159840KB
36 TLE 0% 5552ms 159840KB
37 AC 100% 236ms 58384KB
38 TLE 0% 20002ms 0KB
39 TLE 0% 18822ms 223152KB
40 TLE 0% 20002ms 0KB
41 TLE 0% 20002ms 0KB

ソースコード

#include <vector>
#include <iostream>
using namespace std;
const int mod = 1000000007;
int N, K, D, P, comb[15][15], dp[44][444][2052]; bool vis[44][444][2052];
int func(vector<int> v) {
	int ret = 0, s = 0;
	for (int i = 0; i < v.size(); ++i) {
		s += v[i];
		ret |= 1 << (s - 1);
	}
	ret |= 1 << s;
	return ret;
}
int solve(int dep, int sum, vector<int> v) {
	if (dep == N) return sum == K;
	int fv = func(v);
	if (vis[dep][sum][fv]) return dp[dep][sum][fv];
	int vs = 0, ret = 0;
	for (int i = (int)v.size() - 1; i >= -1; --i) {
		for (int j = 1; j <= D - vs; ++j) {
			vector<int> w(v.begin() + (i + 1), v.end());
			w.push_back(j);
			int mul = comb[D - vs][j] - (i >= 0 ? comb[D - vs - v[i]][j] : 0);
			int res = solve(dep + 1, sum + w.size(), w);
			ret = (ret + 1LL * mul * res) % mod;
		}
		if(i >= 0) vs += v[i];
	}
	vis[dep][sum][fv] = true;
	dp[dep][sum][fv] = ret;
	return ret;
}
int main() {
	cin >> N >> K >> P;
	while (1 << D < P) ++D;
	for (int i = 0; i <= D; ++i) {
		comb[i][0] = 1;
		for (int j = 1; j <= i; ++j) {
			comb[i][j] = comb[i - 1][j] + comb[i - 1][j - 1];
		}
	}
	int ret = solve(0, 0, vector<int>());
	cout << ret << '\n';
	return 0;
}