AtCoder Grand Contest 036 A – Triangle WAからの脱却

はじめに

AGC036A を解くときに詰まったので記録します。

世の中には美しい解法が多いのです。
しかし私は、間違いからの脱却方法の記録も欲しいのです。

間違い

最初に提出したコードでは、01-13.txt のみが通りませんでした。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ll S;
cin >> S;
ll INF = pow(10, 9);
int y2 = – S % INF + INF;
int y3 = (S + y2) / INF;
cout << "0 0 1000000000 " << y2 << " 1 " << y3 << endl;
}
view raw

AGC036_A-1.cpp

hosted with ❤ by GitHub

1つのケースのみ通らないということで、極端な入力を考えれば良いはず。

で、考えた結果、 Sが上限値の10^9 を取るとき、 y2 は0になるべきなのに、上記コードでは10^9 になってしまうことに気が付きました。

修正

y2 を導出する部分のコードを修正して提出。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ll S;
cin >> S;
ll INF = pow(10, 9);
int y2 = (- S % INF + INF) % INF;
int y3 = (S + y2) / INF;
cout << "0 0 1000000000 " << y2 << " 1 " << y3 << endl;
}
view raw

AGC036_A-2.cpp

hosted with ❤ by GitHub

教訓

python を使うことが多かったので、mod の計算を自分で正しくできていなかったのが原因。

負の値 x のmod を取るときは (x % mod + mod) % mod

一回間違えれば次は間違わないはず。

コメント

タイトルとURLをコピーしました