Upgrade to Pro — share decks privately, control downloads, hide ads and more …

yukicoder contest 448 問題解説 E: Strange Online Ju...

Mizar
September 27, 2024

yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5

yukicoder contest 448 [ 2024-09-27 20:00:00〜2024-09-27 23:00:00 (3h) ] のコンテストに出題された問題、「Strange Online Judge」の解説です。

No.2906 Strange Online Judge ★4.5
https://yukicoder.me/problems/no/2906

No.2908 Strange Online Judge (Extra) ★5
https://yukicoder.me/problems/no/2908

yukicoder contest 448
https://yukicoder.me/contests/513

Mizar

September 27, 2024
Tweet

More Decks by Mizar

Other Decks in Programming

Transcript

  1. yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 yukicoder

    contest 448 問題解説 E: Strange Online Judge ★4.5 https://yukicoder.me/contests/513 6問とも C++ および PyPy3 での AC を確認しています。 “ “
  2. 問題 E: Strange Online Judge ★4.5 https://yukicoder.me/problems/no/2906 以下の問題を解くプログラムを指定の形式(StLang、後述)で出力してください。出力するプログ ラムは1000行以下、かつ、制約のもとで1000ステップ以下で正しく実行可能なものとしてくださ い。

    yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 非負整数の集合 について、 「 に含まれない最小の非負整数」を とします。 厳密には、非負整数全体の集合 と非負整数の集合 について、 を と定義します。 正の整数 が与えられた時、数列 を次のように定めます。 さらに与えられた正の整数 における、 の値を求めてください。 制約: は整数 “ “ 2
  3. StLang サンプルコード 二項係数 を求める StLang サンプルコード: # 二項係数 nCk の計算

    (N > 62 の時は演算オーバーフローする可能性あり) if N >= K # N < K の時の出力は 0 とする $0 = 1 $1 = 1 $2 = N while $1 <= K # for $1 in 1..=K $0 = $0 * $2 # $2 == N + 1 - $1 $0 = $0 / $1 # ここで割り算の余りは生じない $2 = $2 - 1 $1 = $1 + 1 end end return $0 yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 3
  4. StLang の主な仕様 StLang では 以上 未満 の整数のみ扱うことができます。 変数は $0 ~

    $9 の10個のみ使えます。各テストケース毎の実行開始時、 $0 ~ $9 の変数は で初期化されます。 テストケースごとに与えられる定数 、定数 を値 K , N として使うことができま す。 算術演算( + , - , * , / , % )は代入文の中で最大1回のみ扱えます。演算の結合はできませ ん。 制御構文として使える if 文, while 文 の条件式では、2つの値の比較演算( == , != , >= , <= , > , < )のみ扱います。 # 文字以降行末までコメントとして扱われます。 複数文字のキーワード( if , while , end , return , == , != , >= , <= )及び10進整数値の文字列の 途中を除き、半角スペースは無視されます。 yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 4
  5. StLang 特筆すべき注意点 10進整数値、定数 K 、定数 N 、変数 $0 ~ $9

    以外のリテラル・定数・変数は利用できません。 1000行を超えるプログラムを出力すると "WA" となります。1行に複数の文を含めることはでき ません。 1ケースにおける代入操作と比較演算の合計実行回数 が を超えると "WA" となります。 10進整数値・算術演算( + , - , * , / , % )にて 未満 の値、 以上 の値、 除算 が発生すると "WA" となります。 制御構文 ( if , while ) では end にてブロック文の終了を対になるように明示することが必要で す。 return 文 はプログラムの最後に1回だけ記述する必要があります。制御構文のブロック内に return 文 を含める事はできません。 制御構文 ( if , while ) における条件式 や return 文 の返り値 の中に算術演算( + , - , * , / , % )を含め る事はできません。 yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 5
  6. レイリーの定理 (ビーティの定理) Rayleigh's theorem Beatty's theorem の条件を式変形すると、 となります。 本問では、与えられた 正の整数

    に対して とすると、 という一般項を求められます。 この は 第 貴金属数の逆数、 は 第 貴金属数 と呼ばれる値になっています。 yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 (1) を満たす正の無理数 に対し、全ての正の整数は 2つの整数列 のいずれかに必ず1回だけ現れる。 (2) 正の実数 において、全ての正の整数が 2つの整数列 のいずれ かに必ず1回だけ現れるならば、 は を満たす正の無理数である。 “ “ 7
  7. 床 関 数の性質(1) floor function 前提: は実数、 は正の整数、 は整数 定理1:

    証明1: より であり、よって 定理2: 証明2: (次ページに続く) yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 8
  8. 床 関 数の性質(2) floor function 前提: は実数、 は正の整数 定理2: 証明2:

    より、 と置くと についても同様にして、 yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 9
  9. レイリーの定理の証明(1) 正整数の集合を分割すること 前提条件 は任意の正の整数 は正の無理数 の 以下の要素の数は より、 かつ は無理数である事に注意すると

    個であ る。 同様に、 の 以下の要素の数は 個である。 床関数の中身が無理数である事より、 辺々加えて、 より は整数であるから 任意の正の整数 に対して、 それぞれに含まれる 以下の要素の個数の和が に等しいため、 の両方に属する正の整数や、 の両方に属さない正の整数は存在し得ない。 (存在するならば、 そのような事が起こる最小の正の整数を と置いた時に の式と矛盾する) ( と に共通した要素はなく、 全ての正の整数は と のいずれ かに必ず含まれる) が成り立つ。 yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 10
  10. レイリーの定理の証明(2) 逆も成り立つこと 前提条件 は任意の正の整数 は正の実数 の場合、 の任意の正整数の要素は に含まれ、 であるため矛盾。 についても同様にして、

    の 以下の要素の数を とおくと 辺々加えて、 の極限を考えると、はさみうちの原理より のいずれかが有理数とすると、 より ともに有理数。 正の整数 を用い とすると、 であるため矛盾。 は となる正の無理数である。 yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 11
  11. レイリーの定理が絡む大学入試問題(1) yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5

    実数 に対し、 を超えない最大の整数を で表す。 1. 正の整数 と 自然数 に対し、不等式 を示せ。 2. 正の整数 と が を満たし、さらにある 自然数 と に対し が成り立つならば、 はともに有理数であることを示せ。 (1992年 慶應義塾大学) “ “ 12
  12. レイリーの定理が絡む大学入試問題(2) yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5

    を正の無理数とする。 2つの集合 を で定める。集合 を と の共通部分とする。集合 を と の和集合とす る。 のとき以下の問いに答えよ。ただし、実数 に対して、 を超えない 最大の整数を と表す。 1. は空集合となることを示せ。 2. のとき、 は の部分集合となることを示せ。 (2016年 京都府立大学) “ “ 13
  13. 貴金属化したワイソフの石取りゲーム Whyoff 正の整数 において、第 貴金属化したワイソフの石取りゲームは、以下のようなルールで行われます。 (オリジナルのワイソフの石取りゲーム は の場合に相当) 2人のプレイヤーでゲームを行う 2つの山にいくつかの石がある

    プレイヤーは交互に石を取っていく 石の取り方のルール: どちらかの山から1個以上を取るか、一方の山から 個・他方の山から 個 を取る 最後の石を取った方が勝ち 第 貴金属数 と 第 貴金属数の逆数 と 正の整数 を用いると、 第 貴金属化した Wythoff の石取りゲームの必勝形は、2つの山の残り個数を の何れかの形にする事です。 自手番でこの必勝形にする事で、相手番では必勝形から必勝形ではない形にする事しか出来ず、その次の自手番では必 勝形でない形から必勝形にする事ができます。 この必勝形のうち が成す数列が本問の の数列に相当し、 が成す数列が本問の の数列に相当します。 yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 14
  14. 実装例 (Python) # python import math def solve(K: int, N:

    int) -> int: assert 1 <= K and 1 <= N return (math.isqrt((K**2+4)*(N**2))-(K*N))//2 + N の値は 64bit整数の範囲を超えることがあります。 本問で要求されている StLang では 64bit整数 の範囲を超える演算はできないので、同じ結果が得ら れるプログラムを工夫して実装することになります。 yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 15
  15. $1 = N/K # $0,$1 := 0,(N/K+1); $1 = $1+1

    $2 = K*N # $2,$3 := (K*N),(N*N); $3 = N*N while $1 > 1 # while $1 > 1: $4 = $1/2 # $4 := $1/2; $1 = $1-$4 # $1 := $1-$4; $4 = $0+$4 # $4 := $0+$4; $5 = $2+$4 # $5 := (K*N+$4)*$4; $5 = $5*$4 if $5 < $3 # if $5 < N*N: $0 = $4 # $0 := $4; end # end end # end $0 = $0+N # return ($0+N); return $0 実装例 (二分探索法) と置いて、 、二次式を用いる と を満たす最大の非負整数 を 二分探索で求め、 とします。 なので、 で探索すると を満たせます。 コード16行・実行236ステップ https://yukicoder.me/submissions/1011067 yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 17
  16. $0 = N+1 # $0,$1 := (N+1),(N/K); $1 = N/K

    $2 = N*N # $2,$3 := (N*N),(K*N); $3 = K*N while $0 > $1 # while $0>$1: $0 = $1 # $0,$1 := $1,(($1*$1+N*N)/(2*$1+K*N)); $4 = $1*$1 $1 = 2*$1 $4 = $4+$2 $1 = $1+$3 $1 = $4/$1 end # end $0 = $0+N # return ($0+N); return $0 実装例 (ニュートン法) を用いて、 の漸化式で を 求めます。 (通常のニュートン法の漸化式 と異なり、床関数が使われている事で終了 条件などに注意が必要です) コード14行・実行48ステップ https://yukicoder.me/submissions/983518 yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 18
  17. $1 = 1 # $0,$1 := 0,1; while $1 <=

    N # while $1 <= N: $2 = $1*K # $0,$1 := $1,($1*K+$0); $2 = $2+$0 $0 = $1 $1 = $2 end # end $0 = $0*N # return ($0*N/$1+N); $0 = $0/$1 $0 = $0+N return $0 実装例 (連分数展開) の有理数近似を使い、 を求めます。 正則連分数を途中で打ち切った時の値(主近似分数)は、 最良近似分数となる(※)ことを利用します。 コード11行,実行225ステップ https://yukicoder.me/submissions/985786 行列累乗やリュカ数列 などを用いて漸化式を高速に求め、計算ステップ数を にす ることもできます。 (※) 第1種最良近似分数・第2種最良近似分数などと呼ばれる定義がありますが、ここでは詳細は省略します。 また、整数部分のみ取り出す第0主近似分数の場合、 などの例外があります。( ではなく が最良近似 ) yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 19
  18. $0 = 1 # q,p,r,s,f = 1,0,0,0,0 # q,p: 文字列

    P に含まれる"o","x" の文字数 # r,s: 結合済み文字列に含まれる"x","o" の文字数 # f: 文字列 P の末尾が "o" なら 0, "x" なら 1 while $0 <= N # while q <= N: # 十分大きな文字列 P を計算する $5 = $0*K # p,q,f := q,q*K+p,1-f $5 = $5+$1 $1 = $0 $0 = $5 $4 = 1-$4 end # end while $1 > 1 # while p > 1: # "o" の文字数が N 文字になるまで処理 $5 = $0%$1 # p,q,f := q%p,p,1-f # P_{n+1},P_n から P_{n-1} を逆算する $0 = $1 $1 = $5 $4 = 1-$4 $5 = N-$3 # t := (N-s)//q # 何回繰り返しで文字列を追加できるか $5 = $5/$0 $6 = $5*$1 # r,s := r+p*t,s+q*t # P の文字列を t 回追加 $2 = $2+$6 $6 = $5*$0 $3 = $3+$6 if $3 == N # if s == N: $1 = 0 # p := 0 end # end end # end if $1 == 1 # if p == 1: $4 = 1-$4 # f,r,s = 1-f,r+(q-K)*(N-s),N $5 = $0-K $6 = N-$3 $5 = $5*$6 $2 = $2+$5 end # end $0 = $2-$4 # return (r-f+N) # 末尾が "x" で終わる場合(f=1) は 1 を引いて取り除く $0 = $0+N return $0 エスパー例 (文字列の構築) 正の整数列 に対し、 に属するものを o 、 に属するものを x でそれぞれ置き換 えた列 を考えます。 で文字列の連結、 で文字列の 回繰り返しを表 し、 x o とする と、 の時、 はそれぞれ の接頭辞となりま す。(連分数展開による近似分数の誤差解析によって正当 性を確かめられます) の場合の の文字列の例: o oox ooxooxo ooxooxoooxooxooox ooxooxoooxooxoooxooxooxoooxooxoooxooxooxo 列 に現れる 番目の o の位置 ( ) は で求めることができます。 コード37行・実行779ステップ https://yukicoder.me/submissions/1009457 yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 21
  19. 問題: Strange Online Judge (Extra) ★5 以下の問題を解くプログラムを指定の形式(定数 M を追加で使えるようにした StLang)で出力してくださ

    い。出力するプログラムは1000行以下、かつ、制約のもとで1000ステップ以下で正しく実行可能なものと してください。 主な変更点: 入力 M が追加、 だった数列の定義が に。 yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 非負整数の集合 について、 「 に含まれない最小の非負整数」を とします。 厳密には、非負整数全体の集合 と非負整数の集合 について、 を と定義します。 整数 が与えられた時、数列 を次のように定めます。 さらに与えられた正の整数 における、 の値を求めてください。 制約: は整数 “ “ 22
  20. https://oeis.org/A184117 s-Wythoff 数列 -Wythoff 数列は、以下のように定義される数列で す。 ここで、 は非減少の正の整数列です。 特に とした場合、

    は下側Wythoff数列、 は上側Wythoff数列となります。 Strange Online Judge においては 、 Strange Online Judge (Extra) においては となります。 以下のページでは、 と置き換えます。 yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 23
  21. Extra問題の一般項 第 貴金属数の逆数 第 貴金属数 Clark Kimberling, Beatty Sequences and

    Wythoff Sequences, Generalized, Fibonacci Quart. 49 (2011), no. 3, 195–200. https://www.fq.math.ca/49-3.html https://www.fq.math.ca/Papers1/49-3/KimberlingGeneralized.pdf yukicoder contest 448 問題解説 E: Strange Online Judge ★4.5 24