kaage精進録

雑な解説とかライブラリとかおきもちの垂れ流しです。

ABC168-E Bullet

マジで何やっても解けねえ

問題リンク

問題概要

考察

とりあえず式変形をして添字ごとでまとめると、結局 \frac{A_i}{B_i} を計算して、かけて -1 だったらダメ、という条件になる。

A_i,B_i0 のときには定義できないが、これは別にして計算できるのでまあどうにかなる。

さて、ここでまず小数を扱う必要が出てくるが、制約が大きいので精度が足りない。

実際、できるだけ約分などをしてclangで提出してみたが、1ケースはWAが出た。 そこで、有理数を使うことにするが、WAがとれない。なぜか。

実は、std::mapで内部的に不等号が使われるため、不等号処理で通分をするとオーバーフローしてしまうのだ。

これをどうにかする方法を考えてもどうにもならないので、std::mapを使うことを諦め、std::unordered_mapへと走る。ただ、自作の有理数クラスにhashを定義してそれを渡さなければいけないので、めんどい。

頑張って作ってclangで提出すると、通った。が、なぜかGCCだと通らない。朝起きてから検証しようと思う。

2020/5/18 追記:どうやらabsでハマっていた模様。std::absとabsの両方が存在[なぜ?]して、absはint型しかとらないのでオーバーフローを起こすらしい。言語仕様どうにかしてくれ。