バイナリエンコーディングでビットを使用して)数値取得していると仮定します。O (log m )
どれだけ速く見つけることができますか(またはそのようなものが存在しないと判断します
たとえば、入力m = 8436285が与えられた場合、n = 27、k = 10を出力できます。
問題の単純なアルゴリズムは、nのすべての可能な値を調べ、プロパティを満たすkの値を検索します。
簡単な観察は、\ log mより小さいまたはO(\ sqrt m)より大きいnの値をチェックする必要がないということです。ただし(n値ごとにO(1)可能なk値のみをチェックできたとしても)これは、入力サイズが指数関数的である非効率的なアルゴリズムになります。
別のアプローチは、kの可能な値を調べて(\ {2,3、\ ldots、2 \ log m \}をチェックするのに十分です)、値をチェックするたびに行います。その後、次を使用できます:
したがって、与えられたkに対して、範囲[\ sqrt [\ leftroot {-2} \ uproot {2} k] {m \ cdot k!}、\ sqrt [\ leftroot {-2} \のn個の値のみをチェックする必要があります。 uproot {2} k] {m} \ cdot {k}]、バイナリ検索を使用して(kが固定されている場合、n \ choose kはnで単調に増加します)、これはO(\ log ^ 2m)。
これはまだ私には非効率的なようで、これは線形時間(入力サイズ)で解決できると思います。