OBI (ブラジル情報オリンピック、英語) に出場する予定で、過去数年間の演習をいくつか試しています。しかし、この演習の解決策が見つかりません (翻訳したので、いくつかのエラーがある可能性があります)。
チョコレートコンテスト
カルロスとポーラはちょうどチョコレート ボールの袋を手に入れました。彼らはすべてをすぐに食べてしまうので、競争を行いました。
- 彼らは次々と交互に食べます(ポーラはいつも始めます)。
- 毎回、ポーラの母親が決めた1個からM個のボールしか食べられないので、窒息することはありません。
- 自分の番でK個のボールを食べた場合、次の人はK個のボールを食べることはできません.
- 上記のルールに従ってプレイできない人は誰でも負けます。
以下の例では、M = 5 で 20 個のボールがあり、Carlos が勝っています。
Who plays How many ate Balls left
20
Paula 5 15
Carlos 4 11
Paula 3 8
Carlos 4 4
Paula 2 2
Carlos 1 1
最終的に、カルロスは勝つために 2 つのボールを食べることができなかったことに注意してください。これは、ポーラが最後のターンでボールを 2 つ食べたためです。しかし、ポーラは最後のボールを食べることができませんでした。カルロスは最後のターンで 1 を食べたため、ポーラはプレーできず、負けました。
どちらも非常にスマートで、最適にプレイできます。相手のターンとは関係なく勝利を保証する一連のターンがある場合、彼/彼女はこれらのシーケンスをプレイします。
仕事:
あなたの仕事は、両方が最適にプレーした場合、どちらが競争に勝つかを見つけることです。
入力:
入力には、標準入力 (通常はキーボード) から読み取る必要がある単一のテスト グループのみが含まれます。
入力には 2 つの整数 N (2 ≤ N ≤ 1000000) と M (2 ≤ M ≤ 1000) があり、N はボールの数、M はターンごとに許可される数です。
出力:
プログラムは、勝者の名前を含む 1 行を標準出力に出力する必要があります。
例:
Input: Output:
5 3 Paula
20 5 Carlos
5 6 Paula
問題を解決しようとしてきましたが、方法がわかりません。
C での解決策はここにあります: http://olimpiada.ic.unicamp.br/passadas/OBI2009/res_fase2_prog/programacao_n2/solucoes/chocolate.c.txtしかし、私はアルゴリズムを理解できません。誰かがこの問題について別のサイトに質問を投稿しましたが、誰も回答しませんでした。
アルゴリズムを教えてください。
プログラムの期待される出力は次のとおりです。