問題の研究ジョセフの種類

  今日は試験T2は、(誰もA私はハング)ハングアップし、問題のジョセフの種類についてのレビューを書きます。

  ジョセフ問題:nは、個々の(第1〜n)は、1からCountinは、退出メートルを報告する、と人々の残りの部分はオフに1つのカウントから開始し続けます。列を順次出力数です

  

  リファレンスを示します。

  アナログは$ O(nm)を$で、その後、私が死亡しました。N、1E8に対するM。

  主な原因役に立たない多くの情報を処理する、あなたのソリューションの残業場合、一般的に見られるように多くの問題を行います。

  そして、情報を処理し、それらの無用アナログを見てみましょう:彼は死んだ一人一人を知っているかもしれません。しかし、タイトルは1つがそれに総ラクダ前に死亡し、これらを知る必要はありません。

  その後、我々は、要件を考えることができます。各ラウンドで死亡した例勝者を知っていないと判定されました。

  この問題が解決された場合、それは時間制限に沿ったものでなければなりません。

  アイデアを切り替える:私たちが考えるとき、死んだように、2はその後、NO 2が存在しないとみなされるのではなく、数が2の死者2人に再割り当てに入れて検討します。これは、問題を解決するための鍵です。

  その後、私はその後、私は人々の数に焦点を当てます、一人だけので、勝者の最終ラウンドで0でなければならないすべての最初の行にどのように変化するかで、この計算をつかみます。

  次に、あなたが戻ってプッシュすることができ、そして毎回人々の数の対象は、層ごとに戻って。

  具体的には:私は、個々の、個々のn + 1-iの残り:それは、K =(Mの%のI)-1号ダイその後、kのための個人を見つけるために、0メートルからでなければなりません。

  0,1,2、...、K-1、K、...、NI:即ち

  その後、我々は付け直さ、Kキルを置きます。

  K + 1、...、niの、0,1,2、...、K-1

  0,1、...... NIK、K、K + 1、... NI-1

  ルールをRelabellingはID「=(ID-K)%のiは

  その後、我々は再発に再び変更にラベルを付けることができます。

  F [I] =(F [I-1] + M)%のI

書式#include <cstdioを>
 使用して 名前空間はstdを、
INT [F 100000020 M、N]、。
INT メイン()
{ 
    scanf関数(" %d個の%のD "、&​​N、&M)。
    int型 I = 2 [I] =(F [I-F;; iが<= N I ++)は1 ] + M)%iは、
    printf(" %Dを\ n "、F [N] + 1 )。
}
長いです

 

おすすめ

転載: www.cnblogs.com/starsing/p/11401713.html