Codeforces Round #711 (Div. 2) 問題文和訳
- A. GCD Sum (500点)
- B. Box Fitting / Коробка (1000点)
- C. Planar Reflections / Отражения от плоскостей (1750点)
- D. Bananas in a Microwave / Бананы в микроволновке (2500点)
- E. Two Houses / Два дома (2500点)
- F. Christmas Game / Рождественская игра (3000点)
A. GCD Sum (500点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
例:
整数 が与えられるので を満たすような最小の整数 を求めてください。
入力
入力の1行目には単一の整数 が与えられる、これはテストケース数である。
その後、 行が続き、各行には単一の整数 が与えられる。
1つのテストにおいて全てのテストケースは異なるものである。
出力
行を出力せよ、 行目には 番目のテストケースの答えである単一の整数を出力せよ。
入出力例
3 11 31 75
12 33 75
注記
サンプルの3つのテストケースについて説明します。
テストケース1: :
なので、 である最小の整数 は です。
テストケース2: :
なので、 である最小の整数 は です。
テストケース3: :
の はすでに です。そのため、これが答えです。
B. Box Fitting / Коробка (1000点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
また、幅 の2次元の箱が与えられます。 は の累乗であってもなくてもよいことに注意してください。さらに、 は最大の長方形の幅以上です。
与えられた長方形を全て収めることができるような、この箱の最小の高さを求めなければなりません。全ての長方形を収めた後に箱の中に空きスペースがあっても構いません。
箱に収めるために長方形を回転させることはできません。さらに、2つの異なる長方形は重なってはいけません、即ち、任意の2つの異なる長方形の交叉領域の面積は0でなければなりません。
サンプル入力の視覚的説明については注記を参照して下さい。
入力
入力の1行目には単一の整数 が与えられる、これはテストケース数である。各テストケースは2行から成る。
各テストケースについて:
- 1行目には2つの整数 と が与えられる
- 2行目には 個の整数 が与えられる、ここで は 個目の長方形の幅である。各 は の累乗である。
- さらに、
全てのテストケースでの の和は を超えない。
出力
個の整数を出力せよ。 番目の整数は 個目のテストケースの答えであり、これは箱の最小の高さである。
入出力例
2 5 16 1 2 8 4 8 6 10 2 8 8 2 2 8
2 3
注記
サンプル入力の1つ目のテストケースについて、次の図は、与えられた5つの長方形を最小の高さの2次元の箱に収める方法の1つを示しています。
2つ目のテストケースでは、2つのブロック(幅8と2のもの)を3層のそれぞれに置くことで最小の高さの3にすることができます。
C. Planar Reflections / Отражения от плоскостей (1750点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
粒子は平面を直接通過することができますが、各平面は崩壊齢 で反対方向に進む粒子である同一のコピーを生成します。崩壊齢が の粒子は、コピーを生成しません*3。
例えば、2枚の平面があり、粒子が崩壊齢 で(右方向に)発射された場合、次のようなプロセスになります(ここで、 とは崩壊齢 の単一の粒子を表す)。
- 1枚目の平面が左向きに を生成し、 を右に通過させる
- 2枚目の平面が左向きに を生成し、 を右に通過させる
- 1枚目の平面が を左に通過させ、左向きに を生成する
- 2枚目の平面が を右に通過させる( はコピーを生成しない)
全体として、最終的な粒子の多重集合 は になります(このテストケースの視覚的説明については注記を参照)。
平面の数が多すぎるとGaurangはこの複雑な状況に対応できません。 と が与えられるのでGaurangが多重集合 の大きさを求めるのを手助けをしてください。
多重集合の大きさは非常に大きくなる可能性があるため、modulo で出力しなければなりません。
注意: 粒子は互いに衝突することなく平面間を行き来することができます。
入力
入力の1行目には単一の整数 が与えられる、これはテストケース数である。その後、 行が続き、各行には2つの整数 が与えられる。
さらに、全てのテストケースでの の和は を超えず、全てのテストケースでの の和は を超えない。1つのテストにおいて全てのテストケースは異なるものである。
出力
個の整数を出力せよ。 番目の整数は 個目のテストケースの答えである。
入出力例
4 2 3 2 2 3 1 1 3
4 3 1 2
3 1 1 1 500 500 250
1 2 257950823
注記
1つ目の入出力例の4つのテストケースについて説明します。
テストケース1: は問題文で既に説明されています。
このシミュレーションである下図を参照してください。異なる色の各直線は異なる粒子の経路を表しています。ご覧のように、多重集合には4つの異なる粒子が属します。反射した粒子の間の縦方向の間隔は、見た目をわかりやすくするためだけのものであることに注意してください(前述のように、2つの異なる粒子が互いに衝突することはない)。
テストケース2: は以下のように説明されます。
- 1枚目の平面が左向きに を生成し、 を右に通過させる
- 2枚目の平面が左向きに を生成し、 を右に通過させる
- 2枚目の平面が を左に通過させる( はコピーを生成しない)
得られた多重集合 の合計サイズは3です。
テストケース3: 平面は3枚ありますが、崩壊齢はたったの1です。ですので、1つの粒子が平面を通過するときに、新しいコピーは生成されません。よって、答えは1です。
テストケース4: 平面は1枚しかありません。粒子は左に新しいコピーを生成します。多重集合 の大きさは2です。
D. Bananas in a Microwave / Бананы в микроволновке (2500点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
現在電子レンジの中にあるバナナの数を とします。初期状態では です。 番目の操作では入力に3つのパラメータ が与えられます。 の値に基づいて次のいずれかを行わなければなりません。
タイプ1: — であるような を選び、次の更新を 回行う:
タイプ2: — であるような を選び、次の更新を 回行う:
は小数値でもよいことに注意してください。詳細は入力形式を参照してください。また、 は最小の整数 のことです。
個目のタイムステップでは、 個目の操作をちょうど1度行わなければなりません。
であるような各 についてちょうど 本のバナナを作ることができる最も早いタイムステップを出力してください。ちょうど 本のバナナを作ることができない場合、 を出力してください。
入力
1行目にはスペースで区切られた2つの整数 と が与えられる。
その後、 行が続き、その 行目は 個目のタイムステップを表す。このような各行には区切られた3つの整数 が与えられる。
が与えられていることに注意してください、これは である。従って を求めるには式 を利用せよ。
タイプ1について であり、タイプ2について である。
出力
個の整数を出力せよ、 番目の整数はちょうど 本のバナナを得ることのできる最も早いタイムステップである(不可能な場合は )。
入出力例
3 20 1 300000 2 2 400000 2 1 1000000 3
-1 -1 1 -1 -1 1 -1 -1 -1 3 -1 2 3 -1 -1 3 -1 -1 -1 3
3 20 1 399999 2 2 412345 2 1 1000001 3
-1 -1 -1 1 -1 -1 -1 1 -1 -1 3 -1 -1 -1 3 -1 2 -1 3 -1
注記
1つ目のサンプル入力で、3つのタイムステップで 本のバナナを作成する方法を見てみましょう。初期状態では です。
- タイムステップ1では、 を選び、タイプ1の更新 を2回適用する。よって は6になる
- タイムステップ2では、 を選ぶ。よって の値は変わらない
- タイムステップ3では、 を選び、タイプ1の更新 を1回適用する。よって は16になる
与えられた操作では、3個未満のタイムステップで を達成することができないことは示すことができます。
2つ目のサンプル入力で、2つのタイムステップで 本のバナナを作成する方法を見てみましょう。初期状態では です。
- タイムステップ1では、 を選び、タイプ1の更新 を1回適用する。よって は4になる
- タイムステップ2では、 を選び、タイプ2の更新 を1回適用する。よって は17になる
与えられた操作では、2個未満のタイムステップで を達成することができないことは示すことができます。
E. Two Houses / Два дома (2500点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
fflush(stdout)
、Javaではsystem.out.flush()
、Pythonではstdout.flush()
、Pascalではflush(output)
を用いることができます。他のプログラミング言語を用いている場合はその言語のドキュメントを参照してください。また、インタラクティブ問題についてのガイド(https://codeforces.com/blog/entry/45307)を読むことをお勧めします。Dixit*4はある都市に住んでいます。この都市には 軒の家があります。各家の組にはちょうど1本の有向の道があります。例えば、2軒の家AとBについて、AからBとBからAのどちらかの有向の道はありますが、その両方ではありません。 番目の家に向かう道の本数を とします。
2軒の家AとBは、AからBへ到達可能であり、かつ、BからAへ到達可能であるとき、双方向到達可能です。家Aから家Bへのパスが存在する場合、家Bは家Aから到達可能であるといいます。
Dixitはこの都市に2軒の家、住むための家と勉強のための家を買おうと思っています。もちろん、彼は一方の家からもう一方の家へ移動したいと思っています。そこで彼は双方向到達可能な家AとBの組を求めたいと思っています。このような組の中で彼は の値が最大のものを選びたいと思っています、ここで は家 に向かう道の本数です。最適な組が複数存在する場合、そのいずれを選んでもよいです。
DixitはCodeCraft*5の準備で忙しいので、目的の家の組を見つけるのを手伝ってください、もしくはそのような家の組は存在しないといってあげてください。
問題の入力では、各道路の方向は与えられません。与えられるのは、各家についてその家に向かっている道の本数 だけです。
ジャッジへは1種類のみのクエリを投げることができます: 2軒の家AとBを与え、ジャッジはAからBは到達可能であるかどうかを答えます。クエリの回数には上限はありません。しかし、ジャッジが"Yes
"と答えた後はさらにクエリを投げることはできません。また、同じクエリを2回投げることはできません。
全てのクエリが終わったら(もしくは、ジャッジがクエリに"Yes
"と返したら)、プログラムは2軒の家についての推測を出力し、終了しなければなりません。
詳しくは相互入出力の項を参照してください。
入力
1行目には都市内の家の数を表す単一の整数 が与えられる。次の行には空白で区切られた 個の整数 が与えられる、 個目の整数は 番目の家に向かっている道の本数を表している。
相互入出力
クエリを投げるには"? A B
" *6 と出力せよ。ジャッジは家Aから家Bへ到達可能であれば"Yes
"と、そうでなければ"No
"と返答する。
最終的な答えを出力するには"! A B
"と出力せよ、ここでAとBは の値が可能な最大値であり、双方向到達可能である。そのような家AとBの組が存在しない場合、"! 0 0
"と出力せよ。
最終的な答えを出力した後、プログラムはすぐに終了しなければならない、そうしなければ、Wrong Answerという判定を得る。
同じクエリを2回投げることはできません。クエリの回数には上限はないが、ジャッジが"Yes
"と答えた後はさらにクエリを投げることはできない。プログラムは最終的な答え("! A B
"か"! 0 0
")を出力して終了しなければならない。
間違った形式で質問をしたり、前の質問を繰り返したりすると、Wrong Answerという判定を得る。
クエリの出力後、改行出力、出力のflushを忘れないようにせよ。そうでなければIdleness limit exceeded
となる。出力バッファのflushのためには次を利用せよ。
入出力例
3 1 1 1 Yes
? 1 2 ! 1 2
4 1 2 0 3 No No No No No No
? 2 1 ? 1 3 ? 4 1 ? 2 3 ? 4 2 ? 4 3 ! 0 0
注記
1つ目のサンプル入力では、3軒の家があり、それぞれに1本の流入路がある都市が与えられます。ユーザープログラムは"? 1 2
"というクエリで家 から家 に到達できるかどうかを尋ねます。ジャッジは"Yes
"と答えます。ここでユーザプログラムは、これで正解を判断するのに十分な情報が得られたと判断します。そこで"! 1 2
"と出力して終了します。
2つ目のサンプル入力では、ユーザープログラムは6つの異なる家のペアを問い合わせ、件の2軒の家がこの都市には存在しないと確信できるため最終的に"! 0 0
"と答えます。
F. Christmas Game / Рождественская игра (3000点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
ゲームが始まる前に特別な整数 が選ばれます。ゲームは次のように進行します。
- Aliceがゲームを開始し、手番ごとに交互に行動する
- どの手番においても、手番のプレイヤーは、深さが 以上であるノード(例えば ) を選ぶ。次にこのプレイヤーそのノードにぶら下がっているプレゼントを正整数だけ取り除く、この数を とする
- この 個のプレゼントを 番目のノードの 番目の祖先( とする)に置く(頂点 の 番目の祖先とは が の子孫であり、[tex;i] の深さと の深さの差がちょうど であるような頂点 のとである)。ここで 番目のノードのプレゼントの数 は だけ減少し、それに応じて は だけ増加する
- AliceもBobも最適にプレイをする。手番を打てなくなったプレイヤーが負けです。
木の根として可能なものそれぞれについて、AliceとBobのどちらがゲームに勝つかを求めてください。
注意: 根が であるような木のノード の深さはノード からノード への単純パス上の辺の本数として定義されます。根 自身の深さは0です。
入力
1行目にはスペースで区切られた2つの整数 が与えられる。
続く 行のそれぞれには2つの整数 が与えられる、これらは2つのノード 間の無向辺を表す。これらの辺は ノードの木を形成する。
次の行には配列 を表すスペースで区切られた 個の整数が与えられる 。
出力
個の整数を出力せよ、 番目の整数は、木の根がノード にあるときにAliceがゲームに勝った場合は 、そうでない場合は である。
入出力例
5 1 1 2 1 3 5 2 4 3 0 3 2 4 4
1 0 0 1 1
注記
サンプル入力で根ノードを1とした場合と2とした場合の答えを計算しましょう。
根ノード1
このケースではAliceが勝利します。AlilceとBobの間で考えられるゲームプレイの1つは次のようなものです。
- Aliceがプレゼントを1つノード4からノード3に移動させる
- Bobがプレゼントを4つノード5からノード2に移動させる
- Aliceがプレゼントを4つノード2からノード1に移動させる
- Bobがプレゼントを3つノード2からノード1に移動させる
- Aliceがプレゼントを3つノード3からノード1に移動させる
- Bobがプレゼントを3つノード4からノード3に移動させる
- Aliceがプレゼントを3つノード3からノード1に移動させる
ここでBobは手番を行うことはできず、負けとなります。
根ノード2
このケースではBobが勝利します。考えられるゲームプレイの1つは次のようなものです。
- Aliceがプレゼントを4つノード4からノード3に移動させる
- Bobがプレゼントを4つノード5からノード2に移動させる
- Aliceがプレゼントを6つノード3からノード1に移動させる
- Bobがプレゼントを6つノード1からノード2に移動させる
ここでAliceは手番を行うことはできず、負けとなります。