KOTET'S PERSONAL BLOG

#atcoder エイシング プログラミング コンテスト 2020

Created: , Last modified:
#atcoder #dlang #tech

これは1年以上前の記事です

ここに書かれている情報、見解は現在のものとは異なっている場合があります。

ABC相当のコンテスト。

結果

4完848位。 EとFが難しかったっぽい。 Dもわからなくて絶望しかけてたけどなんとかコンテスト中に解法を思いついたのでレートの暴落は回避されHighest更新。

コンテスト成績証 - AtCoder

A - Number of Multiples

単純に指示された範囲の整数に対してdの倍数かどうかを判定して数えれば良い。 指示された範囲内だけ正確に列挙できるようにループの書き間違いには気をつけよう(1敗)

提出 #15146161 - エイシング プログラミング コンテスト 2020

……というふうにコンテスト中は書いたが、1からxまでのdの倍数の数はx/dで求められるので、 R/d(L1)/dのようにすればO(1)で求められると思う。

B - An Odd Problem

普通に条件を満たしているマスを数えれば良い。

提出 #15149181 - エイシング プログラミング コンテスト 2020

C - XYZ Triplets

x2+1nx<nより、 x,y,z<nN104=102。 なのでxyzの3重ループをx,y,z102 くらいの範囲で回してやればx2+y2+z2+xy+yz+zx の値が問題に出てくる範囲の数字になる組み合わせは全列挙できる。 これは十分間に合うので、最初に固定長の3重ループで答えのテーブルを作って、入力に合わせてその値を読んでくれば良い。

提出 #15155662 - エイシング プログラミング コンテスト 2020

D - Anything Goes to Zero

popcnt(n)log2nなので、f(n)の値はけっこう小さくなりそうな予感がする。 なので単純に何回操作が可能かシミュレートすればいいのだが、普通にやると入力が大きいのでオーバーフローする。 N2×105なので、最初の操作で値は普通の整数型に収まるようになる。 そのため2回目以降の操作は定義どおりに計算してもいいはずだが、1回目だけは特別な工夫が必要。

まずpopcnt(X)をループで1を数えて計算する。 1箇所ビットを反転させたらpopcnt(Xi)=popcnt(X)±1 になる。 Xの上からiビットめが1の場合、Xi%popcnt(Xi)=(X2N1i)%popcnt(Xi)で、 Xの上からiビットめが0の場合、Xi%popcnt(Xi)=(X+2N1i)%popcnt(Xi)である。 popcnt(X)X%popcnt(Xi)=X%(popcnt(X)±1)O(N)で事前に計算しておけば、 powmodを使ってO(logN)で1回目の操作を行った後の値を計算できる。

あとは愚直にシミュレートしてやれば良い。 popcntが標準ライブラリにあると非常に楽。

提出 #15171056 - エイシング プログラミング コンテスト 2020

E - Camel Train

わかりそうでわからない

F - Two Snuke

まったくわからない