3匹の猫

みみねこの競プロ精進メモ

エイシング プログラミング コンテスト 2020の感想

(タイトル間違ってたのを修正。ABCではない。)
NoSub。Cから解くと決めていて、Cが解けなかった。

A

atcoder.jp
1以上x以下の範囲にある整数のうち、dの倍数であるようなものの個数はx\div dで求められる。累積和的な考えを使うと、答えはR\div d - (L-1)\div dである。O(1)
また、普通にループを使ってl以上r以下の整数をdで割って行ってもOK。O(R)だが、制約がR\leq 100なので余裕をもって間に合う。

B

atcoder.jp
ループを使ってすべての要素を見ていく。「前から奇数番目」と「a_iが奇数」を同時に満たす場合だけカウントする。奇数か否かは、2で割った余りで判定できる。一番最初の要素は0番目ではなく1番目である点に注意。O(N)

C

atcoder.jp
問題文を見たとき、まず等式
x^2+y^2+z^2+2xy+2yz+2zx=(x+y+z)^2
を思いつくが、良い変形が思いつかず断念。
とりあえず愚直に解くことを考えると、各Nに対して、変数x, y, zの値を決め打ちして実際に等式が成り立つならカウントを増やす、という解が思いつく。x, y, zの上限は指定されていないが、これらは全て正の整数なので、この変数のうちどれか一つでも\sqrt Nを超えると明らかに式が成り立たなくなる。よって1\leq x, y, z\leq 100であることがわかる。愚直解の計算量はO(xyzN)で、制約からだいたい10^{10}回の計算が必要となる。
ここで、x, yを決めるとzの値は一つに定まる(∵未確定の変数が1つしかない)ことを利用すると、式変形して
z^2+z(x+y)+(n-x^2-y^2-xy)=0
となり、この2次方程式の解を求めればよいことになる。

(追記:ここの式変形が間違っていた!!正しくは、
z^2+z(x+y)+(x^2+y^2+xy-n)=0
です。)

z1以上の整数であることに気を付けて実装すると答えが求まる。計算量がO(xyN)、制約から10^8回と(ギリギリではあるが)時間内に終わるよう改善された…

と思って実装したのだが、なぜか答えが合わなかった。

(追記:この解法でも一応882msで通りました。)
Submission #15187699 - AIsing Programming Contest 2020

フォロワーさんから聞いた解法を一応残しておく。一度Nを考えず単純にx, y, zを全探索して左辺の値を求め、その値が1からNの範囲内なら配列でカウントしていき、最後に配列の値を順番に出力すると計算量がO(xyz)10^6回で求まる。確かにこちらの方が計算量も少ないし、スッキリとした解法である…。

D

atcoder.jp
まず愚直解を考える。ある数Xに対して、Xpopcount(X)は必ず減少する。さらに言うと、2進数で表現したときの桁数は\log Nだから、popcount(X)は最大でも\log Nである。余りをとる計算の性質からpopcount(X)で割った余りはpopcount(X)以下になるので、一度の操作で大きさが\log N倍になる。
つまり、二進数で表現したときの桁数がNであるような数Xに対して、f(X)を求めるには(N+\log N+\log \log N+\dots)回桁を見れば良いことになる。まあ大体O(N)で求まると考えて問題ない。
全てのX_iに対してこれをやると計算量はO(N^2)となり間に合わないので、高速化を考える。
よく見ると、もとの数XX_iを比べると高々1bitしか違わない。ということは、popcount(X)popcount(X_i)1しか違わない。具体的には、popcount(X_i)の値はpopcount(X)+1か、popcount(X)-1かの2択である。どちらの値になるかは、i桁目が01かを見れば決まる。
また、Xをそのまま10進数に直そうとすると10^{2^{100000}}というとてつもなく大きい数字になってしまうが、最後に余りをとることがわかっているなら、最初から余りをとった値を扱えばよい。具体的には、「Xpopcount(X)+1で割った余り」と「Xpopcount(X)-1で割った余り」のデータがあれば、「X_ipopcount(X)\pm 1で割った余り」をO(1)で求められる。あとは数字がそこまで大きくないので、素直に操作を繰り返すことでf(X_i)の値をO(\log N)で求められる。
これをX_iの個数分(N回)繰り返すので、全体の計算量はO(N\log N)となる。popcount(X)-10になる場合、余りの計算が出来ないので例外処理を書く必要がある。

E

atcoder.jp
見ていない。ぱっと見、データ構造を駆使しそうなイメージ。

F

atcoder.jp
C問題の強化版みたいな見た目をしている。全体で見てもかなり難しいらしい。

感想

NoSubはなるべくしないように心掛けているけど、Cが解けないのはまずいと思って考えているうちに提出しないまま終わってしまった。反省。