Oversleeping, again

2 secs 1024 MB
hirono999's icon hirono999

解説

結論から書くと,bit全探索 + 中国剰余定理が想定です.

目覚まし時計が同時に鳴る周期が短ければシミュレーションすることができますが,本問題の制約では周期が10910^9を超えることがあり厳しいです.

そこでNNが小さいことに注目します.

全ての目覚まし時計の組み合わせについて調べ,「音量の合計がKK以上」となるような目覚まし時計の組が同時に鳴る最小の時刻が求める答えです.

いくつかの目覚まし時計が同時に鳴る最小の時刻は,(存在するならば)拡張ユークリッドの互除法を繰り返し適用することで求めることができます.(実装上はACLのcrtを使うのが楽です). 各組み合わせの最小の時刻においては,注目している目覚まし時計が全て鳴り始めている必要があることに注意してください.


より定式的に,目覚まし時計の部分集合をSSとします.

中国剰余定理よりtAi(modBi),iSt \equiv A_i (\bmod B_i), \forall i \in S の解が存在するならば, tz(mod lcmiS(Bi))t \equiv z (\bmod~ \mathrm{lcm}_{i \in S}(B_i))と書き表せます.

iSCiK\displaystyle\sum_{i \in S} C_i \geq Kが成り立つすべてのSSについての,tmaxiSAit \geq \max_{i \in S}A_iかつtz(mod lcmiS(Bi))t \equiv z (\bmod ~\mathrm{lcm}_{i \in S}(B_i))をみたす最小のttが求める解です.

計算量は,O(2NNloglcm(Bi))O(2^N N \log \mathrm{lcm (B_i)})です.

lcm(1,2,,30)=2329089562800<1018\mathrm{lcm}(1, 2, \dots, 30) = 2329089562800 \lt 10^{18}より,64bit整数の範囲内で拡張ユークリッドの互除法が正しく動きます.