web-dev-qa-db-ja.com

動的計画問題-xmod n = 0となる数字の1と0のみを含む最小の整数「x」を見つけるには

X mod n = 0およびx> 0 .....のように、1と0の数字のみを含む最小の整数「x」を出力するアルゴリズムを設計するには次のようにします。

2は10を割ります

3は111を分割します

4は100を割ります

5は10を割ります

6は1110を分割します

7は1001を除算します。

1と0は基数10の表現です。

鳩の巣原理を使用してこれを解決できることは知っていますが、この問題では最小数に関心があります。

セットに1、10、100、1000などが含まれるサブセット和問題に似たDPアプローチを使用することを考えていました。この問題の漸化式をどのように定式化するかについて、私は完全には明確ではありません。誰かが洞察を与えることができますか?

2
redDragon

動的計画法は、ブルートフォースといくつかのヒューリスティックよりもはるかに優れています。

0-1の整数がmodnになるように、最小桁数を決定してみてください。

たとえば、キーが整数mod nであり、値が最小桁数である辞書を作成して、キーmod nに等しい0〜1の整数が存在するようにすることができます。 (0,0)で始まります。 kごとに、10 ^(k-1)mod nを計算し、すべてのキーaを調べて、b = a + 10 ^(k-1)modnがまだキーであるかどうかを確認します。そうでない場合は、辞書に(b、k)を追加します。 bが0の場合、必要な桁数がわかりました。

最大k桁の数を減らすたびに必要な桁数がわかれば、最小数を再帰的に決定できます。 k桁のmodnに到達した場合、modnに合同な最小0-1の数は10 ^(k-1)に、a-10 ^(k-1)modnに合同な最小0-1の数を加えたものになります。 。

これにはO(n ^ 2)時間がかかります。これは、kごとに、最大n個の古い合同クラスに10 ^(k-1)を追加しながら、少なくとも1つの新しい合同クラスmodnを生成するためです。おそらく、10の小さな累乗が1 mod nの場合など、一度に少数の合同クラスが生成される場合を高速化するメモ化がいくつかあります。

1
Douglas Zare

考えの概要です。

私には、ブルートフォースとストリートスマートが理論的なアプローチを打ち負かすように思われます。

例1

Nに2の因数から多重度Kまでが含まれる場合、最下位桁の連続するゼロのみが2の因数を提供できるため、Xの最下位桁には少なくともK個の連続するゼロが含まれる必要があると推測できます。理論が含まれていないようです。

例2

もう1つのストリートスマートは、10進数の合計で判断される10進数の9による除数です。 (より正確には、9によるモジュロのプロパティです。除算性とは、ゼロを与えるモジュロを指します。3による除算性は、9によるモジュロから導出された単純な結果です。)「モジュロ」を使用すると、任意の数に適用されることに注意してください。 mod(X_candidate, 9) == mod(13, 9) == 4という要件でXの候補をフィルタリングすることによって13と言います。この要件は必要ですが十分ではありませんが、ブルートフォースが必要とするケースの数を減らすのに役立ちます。

2
rwong