「みんなのプロコン 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"; } }