目次

AtCoder Beginner Contest 363 C,F問題メモ

AtCoder Beginner Contest 363

わりと全般的に難しかったでござる。

C - Avoid K Palindrome 2

C - Avoid K Palindrome 2

問題文

制約

解法

解法は、ABCの序盤問題なこともあり全探索と容易に想像できるが、計算量がやや厳しく $O(N!NK)$ となる。
$NK$ の部分は正確には $\frac{K(N-K+1)}{2}$ なので、最大となる $N=10,K=6$ などとして見積もると $5 \times 10^7$ となり、遅い言語ではやや厳しい。
せめて実行時間制約を3秒にしてクレメンス。

小手先の高速化

Pythonの itertools.permutations では、例えば 'aab' だと 'a' の位置を入れ替えただけのものが複数回、返されてしまう。
実質的に同じ並びに関しては2回以上判定処理を行わないようにすると、1/2、1/6、1/24などの定数倍がかかり、間に合う。(同じかどうかの判定に追加の計算が必要となるが)

しかし、最初から全て別の文字の場合はこれが効かない。
ただしその場合、制約上、回文になるものはないので、$N!$ そのものを出力すればよい。
このような場合分けをすれば、なんとかギリギリで通る。

速い人の解法

提出一覧では、Pythonでも1秒未満で通してる方々も居るので、どういうことをしているのか確認してみる。

まぁ、いろいろ書いたが、結局、数値リストにし、forループでチェックするという「PyPyフレンドリーな書き方」にするのが一番大事そう。

Python3

F - Palindromic Expression

F - Palindromic Expression

問題文

制約

解法

まず以下を調べる。
rev(a)は、aを文字列として逆から読んだ数を表すとする。
また、いずれの数も'0'は含まないもののみに限るとする。

$i=1~\sqrt{N}$ の範囲で、①は $i$ と $\frac{N}{i}$ を、②は $a=i$ の場合を調べればよい。
回文判定に桁数分の計算量がかかるので、$O(\sqrt{N} \log{N})$ で列挙できる。

②を使ったり使わなかったりして(同じものを複数使う場合も含め)再帰的に試していき、最終的に①に含まれるものが残れば成功。

Python3