KUPC 2014 E - 何しちゃおっかな?
問題
テトリスのL字ブロック
■ ■ ■■ ■ ■ ■■
を両方少なくとも1回ずつ使って、nxmの長方形のフィールドを隙間なく埋めることができるかを判定せよ。
ブロックは回転させてもよいが、反転させたり、重ねたり、フィールドの外に出したりしてはならない。
制約条件
n, mのペアが10000個以下来る。
n, m≦100000
方針
こういうのはマジでムリゲー。
まずnxmが8の倍数じゃないとダメ。(これそんなに自明か?)
2x4は同じブロック2個置くしかなくて、片方が使えないので無理。
2x8からは、2x4を反転してもう一個おけばいいので作れる。
一方が8の倍数のとき、
3x8, 2x8が作れるので、(5以上)x8は全て作れる。
なので1x8だけがダメ。
一方が2の倍数のとき、もう片方は4の倍数なので2x4を敷き詰めればよくて、
でも2x4だけは作れない。それ以外は作れる。
両方が4の倍数のときは2x4を敷き詰めればいいのでできる。
ソースコード
bool ok(int n, int m){ if((ll)n * m % 8 || n == 1 || m == 1) return 0; return !(n == 2 && m == 4) && !(n == 4 && m == 2); } int main(){ int c; cin >> c; while(c--){ int n, m; cin >> n >> m; cout << (ok(n, m) ? "Possible" : "Impossible") << endl; } return 0; }