DP:壊すことの願いです

説明

ツァイトウントラウムtrennenのDICHウントMICH。
時間と空間があなたと私を分離します。

B氏は、ゲーム、ゲームプレイN ランプおよびn 所定のn個からなるスイッチ1からランプの初期状態、添字nは正の整数。

各状態は、私たちが1を使用してオンとオフの2灯、いるライトを表現するためには0で、明るいライトが消灯している、ゲームの目的は、すべてのライトを出している作ることであることを示しています。

しかし、動作がI 切り替え、全てのiの数(1を含む除数及びI)ランプの状態、すなわち、光からオフになる、または光オフに、変更されます。

B氏は、このゲームは非常に困難見つかったので、すべてのライトが消されるまで、このような戦略の考えは、それぞれが、そのような確率としてスイッチを操作します。

操作の数は、この戦略の多くは、Bは-JUNそのような最適化を考える必要がありました。現在の状況が操作することにより、kに等しい未満とすることができる場合、すべてのライトが退治するようにスイッチを

その後、彼はもはや最小数(この戦略でkが明らかに小さい動作のランダム、直接選択操作方法ないであろう手順)これらのスイッチの動作を制御します。

B氏は、に応じてこの戦略を知りたい(すなわち、第1のランダム動作、以下kおよび最終的になる、ステップ、操作方法を使用して操作の最小数)の動作の所望の数の。

この期待は大きいかもしれないが、B氏は、nによってこの期待見つけ階乗は整数でなければなりませんので、彼が唯一の100003件の整数を知る必要がありモジュロ後に結果を。

1 <= N <= 100000,0 <= K <= N。データ、K = Nの50%。

 

この問題は、長い時間のために、ああ、速い珍しいタイトルの変更が、今日は、戻ってきて、それがなかったにもクッションです。

しかし、私はこの問題の解決策を退廃、そして数回ええと、出たくなかったと思いました。問題を解決して、どのように退廃単にの一部をしていない以上

 

この問題の主な問題は、他のより良い、実際には、定義の状態を判断する方法です。

(...データ水、及び80を得ることができる)、50%のサブ部分を見ます

それは我々が、最適な意思決定はい考えるものです。

まず第一に、あなたは、スイッチの数が少ない、応答しない電球の多数を操作します。

だから、明るい光の中で最大数のために、あなたはそれが、唯一の2つの方法で燃え尽きたいです。

これは、他のは、そのスイッチを超えてオフになって、スイッチでオフになっています。

しかし、このため、最大の数字で最も明るいですので、あなたは、より大きな数で切り替えた場合、その後、セクタ番号で最も明るい電球はさらに大きくなります。

だから、遅かれ早かれ、この時間は、我々は唯一それを自分でオフにすることができ、n個程度に上昇します。それまでは、元の状態を復元します。

もちろん、あなたは、それ自身から直接押します。

少ない数の照明の最大数この後、あなたは問題を解決するために、同じ方法を続けることができます。

だから我々は、このサブセクションを得ました。

しかし、ここまで、私たちは何もDPませんでした。

しかし、我々はいくつかのプロパティを見つけることができます。

スイッチの一つは、代わりにスイッチの他のセットと等価ではありません。

それはスイッチのセットを必要とするように、この場合、我々は、初期状態が与えられ、我々は、同じ部分のコピーを取得することができます。

この場合、我々はあなたがスイッチ、あなたが移動することはできませんスイッチを移動する必要があると主張することができます。

そして、それは、あなたがこれらのスイッチが動か移動することはできませんので、もしをランダム操作です。それが復活したら、その後は再び移動する必要があります

これは、自然の中でと「スワップ動作シーケンスの結果変わらない」「操作さえに等しい回数を操作しないで」と、XOR演算です。

ここでは、我々は、DP配列を意味構築するために始めました。

、あなたが移動する必要がある、あなたが移動することはできません:我々は最後になりましスイッチは重要ではありません、2つだけスイッチするものである、ことを見出しました

だから、実際には、あなただけがそれにいくつかのスイッチを移動する必要があることを知っておく必要があります

DPは、$ [i]はI $スイッチを表しを提供するにも何回所望の動作に応じてスイッチのように、動作する必要があります。移転を考えてみます。

あなたは$ \ FRAC {I} {n}は$ペアで確率を持っている、そしてそれは$ \ FRAC {I} {N} $です

あなたは$ I + 1 $になるための必要性によって、誤ってこの時間を$ \確率FRAC {NI} {n}は$を持っています、

そして、$ 1に$ $ I + 1 $のステップを下に押して、[I + 1] $ $のDPで、あなたが秋を押す必要が戻ってきて、[i]は$ $ DPです。

于是$ DP [I] = \ FRAC {I} {N} + \ FRAC {NI} {N}回\(DP [I + 1] + DP [I] +1)$

約$のDPを得、次いで係数類似アイテム$ $ DP [I]、[I] = 1 + \ FRAC {NI} {I} \回(DP [I + 1] +1)$の合併

そして、その答えは、その後、KにCNTによるオリジナルのものを入れて、K最適な決定文を使用することです。

$ ANS = K + \和\ limits_ {I = K + 1} ^ {CNT} DP [i]は$

もちろん、CNT <= kの場合、答えは、CNTああです。

最後に、$ N!$缶を乗じた質問の意味に従ってインチ

1の#include <cstdioを>
 2  の#define MOD 100003
 3  の#define INT長い長い
 4  int型のDP [MOD]、ST [MOD]、CNT、N、K、ANS。
5  INT QP(INT B、INT T、INT A = 1){ ため(; T; T >> = 1、B = b *表Bの%MOD)であれば(T&1)A = * B型%のMOD。戻り};
 6  メイン(){
 7      (scanf関数" %のLLDの%のLLD "、&​​N&K)。
8      INT I = 1; iが<= N; ++ I)のscanf(" %のLLD "、&ST [I])。
9      のためには、int型 - I; I I = N)であれば(ST [I]){
 10          CNTを++ 11          のためにINT J = 1 ++ J; jは* jの<= 1)であれば(I%のjは== 0 ){
 12              ST [J] ^ = 1 ; もし(!J * J =)ST [I / J] ^ = 1 ;
13          }
 14      }
 15      であれば(CNT <= K){
 16          のためにint型 I = N; iが; - I)、CNT = CNT * I%モッド;
17          のprintf(" %LLDする\ n " 、CNT)。
18          リターン 0 19      }
 20      DP [N] = 1 21      のためにint型 I = N- 1、DP [I] =((NI)* QP(I、mod- - I; I)2)%MOD *(DP [I + 1 ] + 1)+ 1)%モッド;
22      のためにint型 I = K + 1 ; iは= CNTを<; ++ I)ANS =(ANS + DP [I])%MOD; ANS + = Kと、
23      のためにint型 I = N; I; - I)ANS = ANS * I%MOD。
24     printf(" %LLDする\ n " 、ANS)。
25 }
コードの表示

 

良い質問、非常に良いアイデア。

実際には、スムーズにダウン一見難しいことではありませんが、なぜそれを考えることができませんでしたか?

私のアイデアと正のソリューション間の距離。

また、あなたはもっと練習ああを必要とします。

 

おすすめ

転載: www.cnblogs.com/hzoi-DeepinC/p/11669597.html