| 提出番号 | 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;
}