解説
N 個の単語から i 個の単語を選んで並べる方法は N×(N−1)×(N−2)×⋯×(N−i+1) 通りあります。この値を P(N,i) とおきます。例えば、5 個の単語から 3 個の単語を選んで並べる方法は P(5,3)=5×4×3=60 通りあります。
この問題では単語を 1 個以上 N 個以下選んで並べる場合の数を問われているため、答えは i=1∑NP(N,i) となります。
各 i に対して毎回 P(N,i) の値を定義通り計算する i=1∑Nj=N−i+1∏Nj を2重ループで計算する アルゴリズムの時間計算量は Θ(N2) となる (整数の加算と乗算の時間計算量が Θ(1) であることを仮定しています) ため、2 秒間の実行時間制限に恐らく間に合いません。
しかし、P(N,i) の値は P(N,i−1) の計算結果を利用して求められることに注目すると時間計算量を Θ(N) に削減することができ、この問題に正解できます。
P(N,i−1)=N×(N−1)×(N−2)×⋯×{N−(i−1)+1}
P(N,i)=N×(N−1)×(N−2)×⋯×{N−(i−1)+1}×(N−i+1)
=P(N,i−1)×(N−i+1)
解答例 (C++)
おまけ
walking dictionary