AOJ VolumeACPC2015Day1 D : Checkered Pattern
解法
適当に実験すると答えがわかります。
自明っぽいところから攻めて行きます。
まず, g = gcd(h, w) とすると, (h/g, w/g) の長方形を g 回同じように繰り返しているだけだとわかります。なので, ここからは h = h/g, w = w/g としましょう。ここで,
- h+w が偶数のとき
- 長方形の左上のマスの色は 白→黒→白… と交互に入れ替わります。
- h+w が奇数のとき
- 長方形の左上のマスの色は 白→白→白… と一定です。
なので, h+w が偶数の場合には (h, w) における 白と黒の長さの比が得られれば良いです。h+w が奇数の場合は面倒そうに思えますが, h+w が奇数の場合は h と w のどちらかは偶数です。h が偶数であるとすると, 0 ~ h/2 の部分と h/2 ~ h の部分には対称性があるので, 長さの比は必ず 1:1 です。よって, 答えは 1:1 になります。
後は h+w が偶数のときなんですが, これは実験したら 比が (h*w+1)/2 : (h*w-1)/2 になることがわかりました。ナンデナンデショウネ
int main() { cin.tie(0); ios::sync_with_stdio(false); int T; cin >> T; while (T--) { ll h, w; cin >> h >> w; ll g = __gcd(h, w); h /= g; w /= g; if ((h+w)%2) { cout << "1 1" << endl; } else { ll mul = h*w; cout << (mul+1)/2 << " " << (mul-1)/2 << endl; } } return 0; }