- 具体的にはこの問題
- A - Integer Product
- https://atcoder.jp/contests/agc047/tasks/agc047_a
- 本番では文字列で読み込んで1e9倍することで誤差を完全に消してACしたが、EPSで誤差を解消できればもっと速く解けた
- 具体的にはここ
using ld = long double; #define EPS (1e-14) VI A(N); rep(i, N){ ld a;cin>>a; a += EPS; // これがないとWA A[i] = 1e9 * a; }
- 入力として17.000000001などが入力されうるが、long doubleで受け取った時に17.00000000099999999になったりする
その他
- そしてこの誤差はローカルでは発生せず、提出したらサンプルでWAで発生したので厄介だった。コンパイラを合わせればいいのかな?
- 論理は合っているのにWAになる例として以下があり、注意していきたい
- 小数の誤差 (EPSで対応)
- ロリハが衝突 (提出後にmodを変えて結果が変わるなら衝突)
roundしてもいい
ll num = round(a[i] * 1e9);
llround !?
ll num = llround(x*1e9), cnt2 = 0, cnt5 = 0;