結果

提出番号 1353
提出者 E869120
言語 C++
提出日時 2018-07-20 15:43:36
問題名 (64)Or Plus Max 2
結果 TLE
点数 78%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 2ms 8624KB
2 AC 100% 1ms 8320KB
3 AC 100% 2ms 8000KB
4 AC 100% 2ms 8672KB
5 AC 100% 2ms 7824KB
6 AC 100% 2ms 8400KB
7 AC 100% 2ms 8672KB
8 AC 100% 2ms 8336KB
9 AC 100% 2ms 7760KB
10 AC 100% 2ms 8288KB
11 AC 100% 2ms 8048KB
12 AC 100% 2ms 8288KB
テストケース 結果 得点 実行時間 メモリ使用量
13 AC 100% 5ms 19616KB
14 AC 100% 6ms 23056KB
15 AC 100% 12ms 28448KB
16 AC 100% 5ms 14880KB
17 AC 100% 7ms 22304KB
18 AC 100% 4ms 15584KB
19 AC 100% 25ms 82992KB
20 AC 100% 21ms 77600KB
テストケース 結果 得点 実行時間 メモリ使用量
21 AC 100% 9ms 29600KB
22 AC 100% 75ms 42896KB
23 AC 100% 169ms 39120KB
24 AC 100% 72ms 22048KB
25 AC 100% 211ms 47104KB
26 AC 100% 17ms 14352KB
27 AC 100% 153ms 38176KB
28 AC 100% 8ms 12304KB
29 AC 100% 440ms 106512KB
30 AC 100% 292ms 70032KB
テストケース 結果 得点 実行時間 メモリ使用量
31 AC 100% 2512ms 92000KB
32 AC 100% 1395ms 56032KB
33 AC 100% 3830ms 146064KB
34 AC 100% 3730ms 132480KB
35 AC 100% 1047ms 88672KB
36 AC 100% 406ms 44896KB
37 AC 100% 14ms 16880KB
38 TLE 0% 6137ms 239200KB
39 AC 100% 101ms 8720KB
40 TLE 0% 5319ms 187872KB
41 AC 100% 4624ms 175840KB

ソースコード

#include <iostream>
#include <vector>
#include <string>
using namespace std;
#pragma warning (disable: 4996)

vector<pair<int, long long>>x[1024];
int N, K, P, S, F[1024], dp[44][444][1024], dp2[44][44], mod = 1000000007;

vector<int>calc(int pos) {
	if (pos == 0) { return vector<int>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; }
	int len = 0, sz = 1;
	while (sz * 2 <= pos) { sz *= 2; len++; }

	int t = pos - sz, cx = 0; vector<int>A(11, 0); A[0]++;
	for (int i = 0; i < len; i++) {
		if ((t / (1 << i)) % 2 == 1) cx++;
		A[cx]++;
	}
	return A;
}

long long ncr(int n, int r) {
	if (n < 0 || n < r) return 0;
	return dp2[n - r][r];
}

void init() {
	for (int i = 0; i < 44; i++) {
		for (int j = 0; j < 44; j++) {
			if (i == 0 || j == 0) dp2[i][j] = 1;
			else dp2[i][j] = dp2[i - 1][j] + dp2[i][j - 1];
		}
	}
	for (int i = 0; i < P; i++) {
		vector<int>L1 = calc(i);
		for (int j = 0; j < L1.size(); j++) { if (L1[j] == 0) { F[i] = j; break; } }
		for (int j = 1; j < P; j++) {
			vector<int>L2 = calc(j); bool OK = false;
			for (int k = 0; k < 10; k++) {
				if (L1[k] != L2[k + 1] && L2[k + 1] != 0) OK = true;
			}

			if (OK == true) continue;

			long long res = 0, LA = 0, LB = 0, s1 = S;
			for (int k = 0; k < 10; k++) { if (L2[k + 1] == 0) { if (LA == 0) LA = L1[k]; else LB += L1[k]; } }
			for (int k = 0; k <= 10; k++) s1 -= L1[k];

			for (int k = 0; k <= LA; k++) {
				// k : LA の値
				if (LA >= 1 && k == 0) continue;
				for (int l = 0; l <= LB; l++) {
					// l : LB の値
					if (k + l > L2[0]) break;
					res += ncr(LA, k) * ncr(LB, l) * ncr(s1, L2[0] - k - l);
				}
			}
			x[i].push_back(make_pair(j, res));
		}
	}
}

int main() {
	cin >> N >> K >> P; for (int i = 0; i < 11; i++) { if ((1 << i) == P) S = i; }
	init();
	if (K > 360) { cout << "0" << endl; return 0; }

	dp[0][0][0] = 1;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j <= K; j++) {
			for (int k = 0; k < 1024; k++) {
				for (int l = 0; l < x[k].size(); l++) {
					long long to = x[k][l].first, cost = x[k][l].second;
					dp[i + 1][j + F[to]][to] += (1LL * dp[i][j][k] * cost) % mod;
					if (dp[i + 1][j + F[to]][to] >= mod) dp[i + 1][j + F[to]][to] -= mod;
				}
			}
		}
	}
	long long res = 0;
	for (int i = 0; i < 1024; i++) res += dp[N][K][i];
	cout << res % mod << endl;
	return 0;
}