公式
A - AtCoder Reverse Contest 解説
by
A - AtCoder Reverse Contest 解説
by
sounansya
まず、長さ \(99\) の文字列 \(S\) であって、偶数文字目は R 、奇数文字目は A または C であるような文字列を考えます。また、この \(S\) に対し整数列 \(A=(A_1,\ldots,A_{50})\) を \(S_{2i-1}=\) A なら \(A_i=1\) 、\(S_{2i-1}=\) C なら \(A_i=0\) として定義します。このように定義すると、\(f(S)\) は \(A\) の転倒数と一致します。
長さ \(50\) の \(0,1\) からなる整数列で転倒数が最大となるのは \(1\) が \(25\) 個並び、その後に \(0\) が \(25\) 個並ぶ場合であり、この場合の転倒数は \(25^2=625\) です。したがって、この転倒数が \(625\) となる整数列 \(A\) から \(1,0\) となっている連続部分列を \(0,1\) に置き換える操作を \(625-X\) 回行うことで転倒数をちょうど \(X\) にすることができます。あとは転倒数がちょうど \(X\) であるような \(A\) から \(S\) を復元することで \(f(S)=X\) となる条件を満たす文字列 \(S\) が得られます。
a = [1] * 25 + [0] * 25
for _ in range(625 - int(input())):
for i in range(len(a) - 1):
if (a[i], a[i + 1]) == (1, 0):
a[i], a[i + 1] = 0, 1
break
print("R".join("CA"[x] for x in a))
投稿日時:
最終更新:
