ABC168-E Bullet
マジで何やっても解けねえ
問題概要
略
考察
とりあえず式変形をして添字ごとでまとめると、結局 を計算して、かけて だったらダメ、という条件になる。
が のときには定義できないが、これは別にして計算できるのでまあどうにかなる。
さて、ここでまず小数を扱う必要が出てくるが、制約が大きいので精度が足りない。
実際、できるだけ約分などをしてclangで提出してみたが、1ケースはWAが出た。 そこで、有理数を使うことにするが、WAがとれない。なぜか。
実は、std::mapで内部的に不等号が使われるため、不等号処理で通分をするとオーバーフローしてしまうのだ。
これをどうにかする方法を考えてもどうにもならないので、std::mapを使うことを諦め、std::unordered_mapへと走る。ただ、自作の有理数クラスにhashを定義してそれを渡さなければいけないので、めんどい。
頑張って作ってclangで提出すると、通った。が、なぜかGCCだと通らない。朝起きてから検証しようと思う。
2020/5/18 追記:どうやらabsでハマっていた模様。std::absとabsの両方が存在[なぜ?]して、absはint型しかとらないのでオーバーフローを起こすらしい。言語仕様どうにかしてくれ。