あなたは正規表現かどうか尋ねています
(xxx | xxxxx | xxxxx)*
xx ... xに一致します。ここで、xは456回発生します。
これがO(n + a ^ 2)の解です。ここで、aは左側の数値の最小値(この場合は3)です。
あなたの番号が6、7、15であると仮定します。6x + 7y+15zの形式で表現できる番号を「利用可能」と呼びます。指定された番号が利用可能かどうかを確認する必要があります。
あなたがいくつかの数nを得ることができれば、確かにあなたはn + 6、n + 12、n + 18を得ることができるでしょう-一般的に、すべてのk>=0に対してn+6k。いくつかの数nを取得できない場合、n-6も確実に使用できません((n-6)を取得できれば、(n-6)+ 6 = nが使用可能になります)。これは、n-12を意味します。 n-18、n-6kも利用できません。
15が使用可能であるが、9は使用できないと判断したとします。私たちの場合、15 = 6 * 0 + 7 * 0 + 15 * 1ですが、9を取得することはできません。したがって、以前の推論では、すべてのk>=0に対して15+6kが使用可能であり、すべてのk>=0に対して9-6kは使用できません。6で割った数が余りとして3になる場合(3、9、15、21、...)、すぐに答えることができます。数<= 9は使用できず、数>=15は使用できます。
6による除算のすべての可能な余り(つまり、0、1、2、3、4、5)について、使用可能な最小の数を決定するだけで十分です。(残りの3のこの数が15であることを示しました)。
方法:頂点0、1、2、3、4、5でグラフを作成します。与えられたすべての数kについて(7,15-6は無視します)xから(x + k)mod 6にエッジを追加します。それに重み(x + k)divを与えます。6。初期値として0を使用してダイクストラのアルゴリズムを使用します。ノード。アルゴリズムによって検出された距離は、まさに私たちが探している数値になります。
私たちの場合(6,7,15)、数値7は0-> 1(重み1)、1-> 2(重み1)、2-> 3(重み1)、...、5->を生成します。 0(重み1)および数値15は、0-> 3(重み2)、1-> 4(重み2)、...、5-> 1(重み2)を示します。0から3までの最短経路には1つのエッジがあり、その重みは2です。したがって、6 * 2 + 3 = 15は、余りとして3を与える最小の数値です。6 * 1 + 3 = 9は使用できません(以前は手動で確認しました)。
そして、正規表現との関係は何ですか?さて、すべての正規表現には同等の有限オートマトンがあり、私はそれらの1つを構築しました。
複数のクエリが許可されているこの問題は、ポーランドのオリンピックで発生し、私は解決策を翻訳しました。さて、コンピュータサイエンスは実際のプログラマーには役に立たないと言う人を聞いたら、彼に顔を向けてください。