Kazun の競プロ記録

競技プログラミングに関する様々な話題を執筆します.

AtCoder Beginner Contest 247 C問題 1 2 1 3 1 2 1

問題

atcoder.jp

提出解答

解法 1

atcoder.jp

解法 2

atcoder.jp

解法 3

atcoder.jp

問題の概要

整数の列の列  S_1, S_2, \dots を以下で定める.

  •  S_1=(1)
  •  S_{n+1}=S_n \oplus (n) \oplus S_n \quad (n \geq 1)

 S_N を求めよ.

制約

  •  1 \leq N \leq 16

解法

解法 1

 S に関する漸化式が与えられているので, この漸化式を利用して再帰的に求めることができる.

また,  S_{n+1} の計算においては  S_n から求められるので, for 文でも簡単に求められる.

解法 2

 S_n の項の数は  2^n-1 である. このとき,  S_n の第  i S_{n,i}

 \displaystyle S_{n,i}=\begin{cases} S_{n-1,i} & (i \leq 2^{n-1}-1) \\
n  & (i=2^n) \\
S_{n-1, i-2^{n-1}} & (2^n+1 \leq i) \end{cases}

である.

解法 3

このとき,  i \leq 2^n-1 ならば,  S_{n,i} i によって決定されることに注目する. 実は,  S_{n,i} は ( i 2 で割り切る回数)  +1 と一致する.