結果

提出番号 1355
提出者 E869120
言語 C++
提出日時 2018-07-20 16:34:51
問題名 (65)Small Grid and Score
結果 WA
点数 0%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 WA 0% 1ms 8112KB
2 WA 0% 2ms 8672KB
3 WA 0% 2ms 8352KB
4 WA 0% 3ms 7984KB
5 WA 0% 2ms 7968KB
6 AC 92% 3ms 7488KB
7 WA 0% 2ms 8000KB
8 AC 92% 2ms 8016KB
9 WA 0% 3ms 7952KB
10 AC 92% 3ms 8032KB
11 AC 92% 2ms 8704KB
12 WA 0% 2ms 7824KB
13 WA 0% 2ms 8480KB
14 WA 0% 2ms 8368KB
15 WA 0% 53ms 8064KB
16 WA 0% 2ms 8080KB
17 WA 0% 3ms 8016KB
18 WA 0% 2ms 8432KB
19 WA 0% 2ms 7776KB
20 WA 0% 2ms 7632KB
21 WA 0% 1ms 8096KB
22 WA 0% 2ms 8016KB
23 WA 0% 2ms 7792KB
24 AC 92% 2ms 7776KB
テストケース 結果 得点 実行時間 メモリ使用量
25 WA 0% 64ms 7776KB
26 WA 0% 63ms 7792KB
27 WA 0% 63ms 8064KB
28 WA 0% 63ms 7984KB
29 WA 0% 63ms 7776KB
30 WA 0% 6ms 8416KB
31 WA 0% 69ms 7504KB
32 WA 0% 5ms 8304KB
33 WA 0% 58ms 8288KB
34 WA 0% 58ms 8336KB
35 WA 0% 67ms 8336KB
36 WA 0% 5ms 8688KB
37 WA 0% 57ms 8720KB
38 WA 0% 67ms 8144KB
39 WA 0% 62ms 8448KB
40 WA 0% 57ms 8288KB
41 WA 0% 64ms 7264KB
42 WA 0% 8ms 8384KB
43 WA 0% 64ms 8176KB
44 WA 0% 62ms 8400KB
45 WA 0% 63ms 7792KB
46 WA 0% 66ms 8656KB
47 WA 0% 67ms 8720KB
48 WA 0% 57ms 8704KB
49 WA 0% 4ms 8432KB
50 WA 0% 68ms 8720KB
51 WA 0% 6ms 7808KB
52 WA 0% 69ms 8704KB
53 WA 0% 4ms 8080KB
54 WA 0% 64ms 7536KB
55 WA 0% 63ms 7824KB
56 WA 0% 68ms 8048KB
57 WA 0% 11ms 8416KB
58 WA 0% 58ms 8352KB
59 WA 0% 62ms 7536KB
60 WA 0% 57ms 8336KB
61 WA 0% 62ms 7520KB
62 WA 0% 63ms 8400KB
63 WA 0% 69ms 7536KB
64 WA 0% 58ms 8096KB
65 WA 0% 64ms 7792KB
66 WA 0% 69ms 7808KB
67 WA 0% 63ms 8080KB
68 WA 0% 63ms 8064KB
69 WA 0% 57ms 8480KB
70 WA 0% 4ms 8432KB
71 WA 0% 57ms 8080KB
72 WA 0% 62ms 7792KB
73 WA 0% 6ms 8080KB
74 WA 0% 68ms 8224KB
75 WA 0% 62ms 7536KB
76 WA 0% 63ms 8176KB
77 WA 0% 62ms 7552KB
78 WA 0% 63ms 7792KB
79 WA 0% 58ms 8656KB
80 WA 0% 9ms 8160KB
81 WA 0% 56ms 8704KB
82 WA 0% 64ms 8416KB
83 WA 0% 57ms 8080KB
84 WA 0% 58ms 7424KB
85 WA 0% 63ms 7984KB
86 WA 0% 63ms 7808KB
87 WA 0% 63ms 7536KB
88 WA 0% 64ms 8384KB
89 WA 0% 63ms 8432KB
90 WA 0% 64ms 7824KB
91 WA 0% 63ms 7984KB
92 WA 0% 4ms 8432KB
93 WA 0% 65ms 7552KB
94 WA 0% 57ms 7824KB
95 WA 0% 7ms 7824KB
96 WA 0% 63ms 7248KB
97 WA 0% 68ms 8048KB
98 WA 0% 63ms 8448KB
99 WA 0% 3ms 7968KB
100 WA 0% 5ms 8416KB
101 WA 0% 57ms 8704KB
102 WA 0% 10ms 8720KB
103 WA 0% 57ms 8176KB
104 WA 0% 67ms 8336KB
105 WA 0% 57ms 7808KB
106 WA 0% 8ms 8704KB
107 WA 0% 57ms 8720KB
108 WA 0% 66ms 8144KB
109 WA 0% 67ms 8400KB
110 WA 0% 58ms 8704KB
111 WA 0% 5ms 8416KB
112 WA 0% 64ms 7648KB
113 WA 0% 68ms 8656KB
114 WA 0% 12ms 7776KB
115 WA 0% 64ms 8048KB
116 WA 0% 63ms 7232KB
117 WA 0% 70ms 7824KB
118 WA 0% 5ms 8096KB
119 WA 0% 64ms 8448KB
120 WA 0% 64ms 7984KB
121 WA 0% 6ms 8672KB
122 WA 0% 58ms 7776KB
123 WA 0% 67ms 7776KB
124 WA 0% 58ms 7792KB

ソースコード

#include <iostream>
#include <vector>
#include <string>
#include <tuple>
#include <algorithm>
using namespace std;

int Rand(int p, int q) {
	int s = 0, t = 1;
	for (int i = 0; i < 3; i++) { s += (rand() % 1024)*t; t *= 1024; }
	return p + s % (q - p + 1);
}

long long dp[44][44], dp2[44][44];

pair<vector<string>, long long> solve(long long N) {
	for (int i = 2; i < 44; i++) {
		long long H = i / 2, W = (i + 1) / 2;

		for (int j = 1; j <= 100; j++) {
			vector<string>F(H, "");
			for (int j = 0; j < H; j++) { for (int k = 0; k < W; k++) F[j] += "."; }

			long long S = Rand(H * W / 2, H * W * 2 / 3 + 1);
			for (int k = 1; k <= S; k++) {
				while (true) {
					int px = Rand(0, H - 1), py = Rand(0, W - 1);
					if (F[px][py] == '.') { F[px][py] = '2'; break; }
				}
			}
			bool OK = false; dp[0][0] = 1;
			for (int k = 0; k < H; k++) {
				for (int l = 0; l < W; l++) {
					if (k == 0 && l == 0) continue;
					dp[k][l] = 0;
					if (k >= 1) dp[k][l] += dp[k - 1][l];
					if (l >= 1) dp[k][l] += dp[k][l - 1];
					if (F[k][l] == '2') dp[k][l] *= 2;
					if (dp[k][l] > N) { OK = true; break; }
				}
			}
			if (OK == true || !(N * 5 / 6 <= dp[H - 1][W - 1] && dp[H - 1][W - 1] <= N)) continue;

			dp2[H - 1][W - 1] = 1;
			for (int k = H - 1; k >= 0; k--) {
				for (int l = W - 1; l >= 0; l--) {
					if (k == H - 1 && l == W - 1) continue;
					dp2[k][l] = 0;
					if (k < H - 1) dp2[k][l] += dp2[k + 1][l];
					if (l < W - 1) dp2[k][l] += dp2[k][l + 1];
					if (F[k][l] == '2') dp2[k][l] *= 2;
				}
			}
			long long A = N - dp[H - 1][W - 1];
			vector<tuple<long long, int, int>>vec;
			for (int k = 0; k < H; k++) {
				for (int l = 0; l < W; l++) { if (F[k][l] == '.') vec.push_back(make_tuple(dp[k][l] * dp2[k][l], k, l)); }
			}
			sort(vec.begin(), vec.end());
			for (int k = 0; k < vec.size(); k++) {
				if (A >= get<0>(vec[k])) { F[get<1>(vec[k])][get<2>(vec[k])] = '1'; A -= get<0>(vec[k]); }
			}
			long long SS = 0, V = A;
			while (A >= 2) { if (A % 2 == 1) SS++; A /= 2; SS++; }
			if (SS <= (H + W + 1)) {
				return make_pair(F, V);
			}
		}
	}
	return make_pair(vector<string>{""}, -1);
}

char c[60][60];

void getans(long long N) {
	for (int i = 0; i < 60; i++) { for (int j = 0; j < 60; j++) c[i][j] = '#'; }
	pair<vector<string>, int>C = solve(N);

	int H = C.first.size(), W = C.first[0].size();
	for (int i = 0; i < H; i++) {
		for (int j = 0; j < W; j++) { c[i][j + 2] = C.first[i][j]; }
	}
	for (int i = 0; i < H + 2; i++) c[i][0] = '.'; c[0][1] = '.'; c[H][W + 1] = '.';
	for (int i = 0; i < W + 2; i++) c[H + 1][i] = '.';

	vector<int>G; long long V = C.second;
	while (V >= 2) { if (V % 2 == 1) { G.push_back(1); V--; } G.push_back(2); V /= 2; }
	reverse(G.begin(), G.end());

	int cx = 1, cy = 0;
	for (int i = 0; i < G.size(); i++) { c[cx][cy] = ('0' + G[i]); if (cx < H + 1) cx++; else cy++; }

	cout << H + 2 << " " << W + 2 << endl;
	for (int i = 0; i < H + 2; i++) {
		for (int j = 0; j < W + 2; j++) cout << c[i][j]; cout << endl;
	}
}

int main() {
	long long n; cin >> n;
	getans(n);
	return 0;
}