1からまでの各数値が、マルチセットのいくつかの要素の合計として一意に表現できるようなマルチセットの数


11

私の問題。与えられた、私は、有効なマルチセット数カウントする。マルチセットは次の場合に有効ですS SnSS

  • の要素の合計はであり、nSn
  • からまでのすべての数は、いくつかの要素の合計として一意に表すことができます。n S1nS

例。 たとえば、n=5場合、{1,1,1,1,1},{1,2,2},{1,1,3}は有効です。

ただし、2は\ {1,1 \}\ {2 \}の両方で形成できるため、S={1,1,1,2}は無効です(つまり、2は2 = 1 + 1および2 = 2)なので、2番目の条件は成立しません。同様に、3は\ {2,1 \}および\ {1,1,1 \}で形成できます。{1,1}{2}2=1+12=2{2,1}{1,1,1}

S={1,2,4 }も無効です。これは、1から5までのすべての数値を5一意に作成できるためですが、Sの要素の合計は5でSはありません。5


私はかなり前からこの問題に適したアルゴリズムを見つけようとしましたが、解決できません。codechefからです。提出されたソリューションのいくつかを見ましたが、問題を解決するためのロジックをまだ取得できませんでした。注:質問の制限時間は10秒で、n<109

マルチセットの場合、表記S={(a1,c1),(a2,c2)...} ai<aj if i <jの場合i<j、これはaiがマルチセットSでci回発生することを意味します。

今まで私はいくつかの結論を導き出しました

  • 必要なソートされたマルチセットの最初の要素がなければなりません1
  • レッツは、2つのプロパティに従うセットであり、次にRS={1,a2ak}|a1a2akr<k  ar+1=ar or (i=0rai)+1
  • LET、ここでは回発生し、必要なプロパティに従い、上記の結論から and場合は。 証明:A I C II A I | n + 1 a i | a j j > i aa i cS={(1,c1),(a2,c2)(ak,ck)}|a1a2akaicii ai|n+1ai|ajj>i
    ai+1=(aici+ai1)+1ai|ai+1
  • 今検討すなわち、すべて1の後の後続の数値は、倍数になります。したがって、可能なマルチセットの数とすると、ここで、可能なすべての数()を合計しています。言い換えると、D F N f n = d d 1S={1,11d1,d,dd,dm1,dm1dm1,dm2,dm2dm2,}df(n)1s=d1fn1=gn=d| ndngdf(n)=d|n+1,d1f(n(d1)d)1s=d1f(n1)=g(n)=d|n,dng(d)

最後に、私の問題はこれに削減されます- 時間制限を超えないように効率的な方法で見つけます。g(n)


2
他の人に練習問題の解決策とアルゴリズムを公に投稿するよう依頼することが適切かどうかを確認しましたか?Codechef FAQ 、ソリューションが公開されないことを期待しているようです(いくつかの非常に基本的な問題を除きます)。ここに解決策を投稿すると、他の人にとって練習問題が「台無し」になりますか、それとも問題ありませんか?Codechefコミュニティの規範とエチケットについてはよく知りません。
DW

faq でパブリックドメイン質問を投稿ないことに関連するもの何も見つかりませんでした。この制限は、練習問題ではなく進行中のコンテスト問題に関するものです。
正義リーグ

1
@DW進行中のコンテスト以外の問題について話し合っても問題ないと思います。
Ravi Upadhyay 2013

1
入力番号のパーティション数を探しています。この流行語を使用していくつかの調査を行うことをお勧めします。
ラファエル

2
@Raphael、同意します、ポスターはそれらのテクニックについて読むべきです。それはまったく同じ問題ではありません-投稿者の最初の条件はこれがパーティションであることを要求しますが、2番目の条件は追加の制限を課します(ユニークな変更のため)-数をカウントするために使用される同じテクニックを適用することは可能かもしれません追加の要件に対処するためにいくつかの変更を加えたパーティションの。
DW

回答:


2

これが最速のソリューションです。実際に関数計算しています 与えられた、それを因数(次に、が(プロパティP)を意味するようにすべての因子(以下を参照)をある順序で計算します。ここで、所定の順序で因子を調べて、式に従ってを計算します。プロパティPは、我々の計算時にことを保証、我々はすでに計算している、すべての非自明な要因のためにの。最適化もあります(以下を参照)。n f 1

g(n)=dnd<ng(d),g(1)=1.
nf i | F J I J G G D G E Ef1,,fmfi|fjijgg(d)g(e)ed

より詳細には、因子を順に検討し、各因子について、どれが除算するかをチェックすることにより、その重要な因子をすべて見つけます。f 1f i 1 f ifif1,,fi1fi

因数分解:前処理:エラトステネスのふるいを使用して、未満のすべての素数のリストを作成します。与えられると、単純に試行分割を使用します。 n109n

すべての要因の生成:これは再帰的に行われます。仮定。我々は実行ネストされたループ、及び出力。誘導によって特性Pを証明できます。 T L 1{ 0 ... K 1 } n=p1k1ptkttPl1{0,,k1},,lt{0,,kt}p1l1ptlt

最適化:プログラムは複数の入力で実行されるため、メモ化を使用して、さまざまな入力間で時間を節約できます。メモするのは小さな値(最大)だけであり、これによりすべてのメモされた値を配列に格納できます。配列はゼロで初期化されているため、既知の値がわかります(すべての計算値が正であるため)。105


素因数分解が場合、はにのみ依存し、実際にはこのベクトル。未満のすべての数値には、最大素因数(繰り返しあり)があり、、それらすべて(または)を再帰的に計算することは現実的です。多くの異なる入力がある場合、このソリューションはより高速になる可能性があります。現状ではです。p k 1 1p k t t f n k 1k t10 9 29 p 29 = 4565 f gn+1p1k1,,ptktf(n)(k1,,kt)10929p(29)=4565fg10

パーティションを対応するマッピングするこの関数が明示的な分析形式を持つことも可能です。例えば、、によって与えられるA000670、及びで与えられるA005649又はA172109g g p 1p tg p 2 1 p 2p tg(pk)=2k1g(p1pt)g(p12p2pt)


1

OK、これで繰り返し関係ができました質問の最後を参照してください)。g()

この時点では、を計算するための再帰的アルゴリズムを書き留め、メモ化を適用してを2回以上計算しないようにするのが自然なアプローチのようです。つまり、を計算するとき、それをマップするハッシュテーブルに格納します。今後を知る必要がある場合は、ハッシュテーブルで調べることができます。g i gg(n)g(i)I G I Gg(i)ig(i)g(i)

これは因数分解を必要としません、そこファクタリングのための効率的なアルゴリズムは、際。n nnnn109

整数シーケンスのオンライン百科事典でシーケンスを 検索することもできます。エンサイクロペディアでシーケンスを見つけた場合、追加の役立つ情報(シーケンスを計算するための効率的なアルゴリズムなど)が提供されることがあります。確かにそれは物事の面白さを取り除くかもしれません。g(1),g(2),g(3),g(4),g(5),


0

ここにあなたを始めるためのヒントがあります。整数のパーティションのセットを列挙するための標準の動的プログラミングアルゴリズムを適用し、すべての合計を繰り返しチェックして変更を加え、一意性を検証することにより、一意の変更を可能にするロジックを追加するロジックを追加します。

もう少し詳しく:マルチセットがあるとします。数値が与えられた、合計がサブマルチセットをどのように識別できますか?そのサブマルチセットが一意であるかどうかをどのように確認できますか?変更を加えるために、標準の動的プログラミング手法を採用してみてください。(この質問も参照してください。)iSiS I1inSi

多重集合を考えると、どのようにそれを満たすかどうかを1からのすべての番号かどうかを第二の条件、すなわち、チェックすることができ一意のSUBMULTISETの和として表現することができる(独自の変更行う条件)?以前の問題を解決すれば、これはかなり簡単なはずです。n SSnS

聞かせてあなたの条件の両方を満たすマルチセットのリストを示しています。を知っている場合、どのようにその情報を使用してを構築できますか?ここでは、整数のパーティションを列挙するために、標準の動的プログラミング手法を採用することができます。P 1 P 2 P n P(n)P(1),P(2),,P(n)P(n+1)


これはおそらくより良いアプローチです。

仮定その両方を満たすあなたの条件の(のためのマルチセットである)を。それを拡張して、要素が1つ多いマルチセットを取得するにはどうすればよいですか?言い換えると、もう1つの要素を追加するすべての方法を特定して、(いくつかの)両方の条件を満たす新しいマルチセットを取得するにはどうすればよいですか?ST S T n nTSTn

回答:がいくつかの要素の合計として表現できる場合、それをに追加しても意味がありません。これは、が一意性条件に違反する原因になります。したがって、いくつかの要素の合計として表現できないすべての整数を列挙できます。それぞれがに追加され、両方の条件を満たす新しいマルチセットを取得できる可能性があります(他の)。S S TxSSTS S T nxSSTn

さらに、動的プログラミングを使用して、の要素のいくつかの合計として表現できる整数と表現できない整数を列挙することができます。ブール値の2次元配列を作成します。整数をいくつかの合計として表現する方法がある場合はtrueです。第の要素(最初の要素使用の対象であり、ここでソートされているので、と)。なお、A [SA [ I J ] J iは、S I S S S = { S 1sは2... S K } 1S 2S K A [ I J ]A[1|S|,1n]A[i,j]jiSiSSS={s1,s2,,sk}s1s2skA[i,j]の値を使用して計算できます。特に、なら、または、さもなければ。これにより、に追加する候補となるすべての番号を特定できます。 SA [ I J ] = A [ I - 1 J ] A [ I - 1 J - S I ] J > S I A [ I J ] = A [ I - 1 J ]A[1i1,1j1]A[i,j]=A[i1,j]A[i1,jsi]j>siA[i,j]=A[i1,j]S

次は、各候補の拡張のためにの(1つの要素を加算した)、我々がいるかどうかチェックしたい満たす条件の両方。ましょうの要素の和で表す、およびの要素の和。の範囲にあるすべての整数がいくつかの要素の合計として表現できるかどうかを確認する必要があります。これも、動的プログラミングを使用して、変更を行うための標準アルゴリズムを使用して解決できます。(実際、配列がまだある場合S STSSn S n T n + 1 n + 2 n T A A [ 1 | T | 1 n ] A [ | T | n + 1 ] A [ | T | n + 2TnSnTn+1,n+2,,nTA上記のように、簡単に少し拡張してこの問題を解決できます。これを配列にして、追加のエントリをすべて入力し続け、はすべてtrueです。)これで、拡張するすべてのマルチセットを列挙できます単一の要素によるで、両方の条件を満たす。A[1|T|,1n]T SA[|T|,n+1],A[|T|,n+2],,A[|T|,n]TS

これは、ある範囲までのすべての、たとえばについて、条件を満たすすべてのマルチセットを列挙するアルゴリズムをすぐに提案します。配列。ここで、は合計が5になるすべてのマルチセットを格納し、一般には合計がなるすべてのマルチセットセットを格納します。N N 20 P [ 1 ... 20 ] P [ 5 ] S P [ N ] S NSnn20P[120]P[5]SP[n]Sn

次に、繰り返し入力できます。最初にを設定して、1つのマルチセットのみを含めるようにします。次に、毎、(1〜20からカウントアップ)毎に、すべての可能な拡張列挙の(上記の技術を使用して)、聞かせての要素の和示す、が存在しない場合、および場合は、挿入します。P [ 1 ] { 1 } N S P [ N ] T S N ' T T P [ N ' ] N '20P[n]P[1]{1}nSP[n]TSnTTP[n]n20

これはかなりできるはずです。幸運を!楽しんで!詳細を検討することは、動的プログラミングのよい学習練習になります。


整数のパーティションは指数関数的になるため、すべてを列挙することはできません。私は質問を編集して、の範囲と私の考えのいくつかを含めましたが、それでも私は行き詰まっています。あなたが助けることができるかもしれません。n
正義リーグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.