ARC105-C:Base -2 Number
問題
https://beta.atcoder.jp/contests/abc105/tasks/abc105_c
整数 が与えられる。 の 進数表現を求めよ。
考え方
考え方は通常の 進数を求める方法と同じだが、操作をちゃんと理解していないと実装でバグります。通常の 進数(今回は 進数とします) の求め方を復習しておきます。
例として 進数で と表現される数の 進数表現を考えます。これは を で割り続けてそのあまりを求めればよいです。以下のような要領でした。
右側が数で左があまりです。
99 | |
---|---|
49 | 1 |
24 | 1 |
12 | 0 |
6 | 0 |
3 | 0 |
1 | 1 |
0 | 1 |
あまりを後ろからみて となります。
なぜこのような方法で求められたのか考えてみます。
・・・
つまりあまりを順次求めていくことで が必要な回数がわかることになります。
この考えと同様に で割り続ければよいです。ただし、負数で割るときは注意が必要です。たとえば となることから、 を で割ったときの商は になります。これはあまりが になるときに事前に することで調整することにします。
public void solve(int testNumber, InputReader in, PrintWriter out) { long n = in.nextLong(); out.println(keta(n, -2)); } String keta(long num, long mod) { if (num == 0) { return "0"; } StringBuilder sb = new StringBuilder(); while (num != 0) { if (num % mod == 0) { sb.append('0'); } else { sb.append('1'); num -= 1; } num /= mod; } return sb.reverse().toString(); }
ポイント
- 進数の求め方
類題
特になし
雑記
本番中は ... ... で全列挙しようとしていましたが、サンプル2のような20bit以上必要な数の場合に死んでました...