「みんなのプロコン 2018」決勝B: 経路が色々

https://beta.atcoder.jp/contests/yahoo-procon2018-final/tasks/yahoo_procon2018_final_b

たぶん想定解よりも思いつきやすい方法で。
base-3でやらず、base-2でやりました。例えばK=217(二進法で11011001)ならこのようにやります。

........#
.##.###.#
..#..##.#
.........
.......#.
.......#.
.....#.#.
.....#.#.
...#.#.#.
...#.#.#.
.#.#.#.#.
.........

ポイントは下の三角形の領域で2^Nを作り出していることです。
上の3行でうまくbitに対応するように制御している感じです。よく見ると3行目が..#..##.(#)となっており、1が.、0が#に対応していることがわかります。

ll K;
ll ans[64][61];

void solve() {
	cin >> K;
	for(int i = 1; i < 61; i += 2) {
		for(int j = 0; j < i; j++) ans[62 - j][i] = 1;
	}
	rep(i, 0, 3) ans[i][60] = 1;
	int pv = 0;
	rep(i, 0, 60) {
		if(!(K & (1ll << (59 - i)))) {
			ans[1][i] = 1;
			ans[2][i] = 1;
			pv = 0;
		}
		else {
			if(pv == 1) ans[1][i] = 1;
			pv = 1;
		}
	}
	cout << 64 << " " << 61 << "\n";
	rep(i, 0, 64) {
		string str;
		rep(j, 0, 61) str += (ans[i][j] ? '#' : '.');
		cout << str << "\n";
	}
}