A. Changing a Character
小文字にする.解答例
B. YYMM or MMYY
YYが00
のときも駄目だと思ってしまった(西暦の下2桁なので00
があってもよい).2桁ずつ取って,それが1以上12以下であれば月として使える.これを両方について試し,条件分岐すればよい. 解答例
C. Dice and Coin
ABCDEの中で一番困った. 解答例
N面サイコロの出目をすべて試す(出目をvとする).このとき得点がKになる確率を調べたい.K≤vのときはサイコロを振った時点でゲームが終了するため,確率は1.v<Kのときはコインを投げる必要がある.投げる回数をiとすると,K≤v×2iとなる最小のiを求めることになる.これはlogを用いてlog2vK≤iと変形できるから,i=⌈log2vK⌉.従って確率は2i1.これをvについて合計すればよい.
なおループでiを求めても間に合ったようだ.これはループ回数が先の⌈log2vK⌉であることからO(NlogK)となる.
D. Even Relation
図示するとよい. 解答例
まず奇数長の辺で結ばれた2つの頂点p,qは違う色でなければならない.このとき,その一端qからさらに繋がる点rについて:
- 辺(q,r)の長さが奇数長:q,rは異なる色にする必要があるが,これは可能である((p,r)の距離は偶数長であるからp,rを同じ色にしてよい).
- 辺(q,r)の長さが偶数長:(p,r)の距離は奇数長になるからp,rは異なる色である必要がある.p,qとp,rがそれぞれ異なる色同士であるから,q,rは同じ色.
よって奇数長の辺の一つの端点を選び,そこから繋がる点について再帰的に「辺の長さが奇数長であれば前の頂点と異なる色,偶数長であれば同じ色を塗る」処理を行えばよい.すべての辺が偶数長の場合はどのように頂点を塗ってもよいため適当に頂点を選べばよい.さらにすべてが偶数長でなくとも適当に頂点を選んでよい(奇数長の辺に遭遇するまですべて同じ色で塗ることになるが,その結果は奇数長の辺から始めた場合と同一であるから).
なお辺が偶数長であるときは本来両端に異なる色を塗ってもよいのだが,奇数長の辺が存在する場合失敗することがある.例えば辺(1,2)の長さが1,(2,3)の長さが2のとき,2,3に異なる色を塗ると1,3の色が等しくなるが,距離は3と奇数.
E. 1 or 2
解答例
まずAXi+AYi+Ziが偶数であることから,AXi+AYiの偶奇が分かる.ここでAiがすべて1か2であることに注意すると,AXiの値が分かればAYiの値も偶奇性から分かる(!).これは連鎖する:Ap+AqとAq+Arの偶奇が分かっているとき,Apの値が分かればAqの値が分かり,さらにArの値が分かる.
従ってこの関係を図示する,すなわち辺が各(Xi,Yi)であるようなグラフを描けば,各連結成分について1つ値が分かりさえすれば残りの要素もすべて分かることになる.したがって連結成分の数が答えとなる.これはUnionFind(またはDFSなど)で調べられる.
F. XOR Matching
抽象的に区間の共通部分をうまく使う方法を考えていたが浮かばず.解説放送でも触れられていたが構築問題なので実験してみるべきだった. 解答例
解けなかった構築問題の記事をどう書けばいいかは難しいところだが,結論から言うとK≤2M−1のときに次のような形を作るとほとんどの場合でうまくいく(ただし...にはKは含まれない):
0,1,2,...,2M−1,K,2M−1,...,2,1,0,K
こうするとK以外の整数v同士が作る区間の共通部分をそのまま使い回せて(v同士のxorは0となるためxorが内側と等しくなる),その値は中央のKとなる.Kが作る区間についてはK,...,2,1,0,Kとなるが,このxorも実はほとんどの場合でKとなる:
aの値が2M−1までであることに注目すると,この区間は
K,2M−1,2M−2,...K+1,K−1,...,2,1,0,K
となり,xorはK⊕2M−1⊕...⊕0となる(順序を入れ替えることで...はKを含む).これはABC121-D: XOR Worldでも出題されたように隣り合う偶数と奇数のxorが1になることを利用すればK⊕1⊕...⊕1となる.この1の個数は2M/2であり:
- M=0のとき:
- 1の個数がバグるのでこの構築法は使えない.
- 実際に試すとa={0,0}しかない.よってK=0のみが存在.
- M=1のとき:
- 1は1個.よってxorはK⊕1となる.これがKと等しいような数は存在しない(K⊕1=Kの両側にK⊕を適用すれば1=0).すなわちこの構築法は使えない.
- 一方で,入出力例にもあるようにM=1でも解を持つことがある.全探索で求めればよい.パターンは2!2!4!=6通り,対称性を考慮すれば
0011
, 0101
, 0110
, 1001
の4つであり,ここからK=0のときは複数の解が存在する一方で,K≥1のときは存在しないことが明らかになる.
- M≥2のとき:
- 1は2M/2個であるが,これは偶数.従ってxorはK⊕(1⊕...⊕1) =K⊕(0⊕...⊕0)=K.
- ゆえに確かにK同士の区間のxorもKとなるから,この構築法が使える.
最後にK>2M−1の場合:このときは先の構築はできないが,0から2M−1までの数を適当に選んでxorで作れる値の最大値は2M−1である(2Mに相当するビットが立っている数が存在しないため,いかなるxorの結果もこのビットを持たない,すなわち2M以上にならない)から弾いてしまって問題ない.
結論:
- K≤2M−1のとき
- M=0またはM=1のとき: 実際に試すとK=0しかない
- M≥2のとき: 構築法を用いると作れる
- K>2M−1のとき: 作れない