C - Filling 3x3 array Editorial by taiga0629


\(N\)=max(\(h_1,h_2,h_3,w_1,w_2,w_3\))として\(O(N^2)\) で解く方法を紹介します。
まず明らかに\(h_1+h_2+h_3 \neq w_1+w_2+w_3\) のとき答えは0です。以下\(h_1+h_2+h_3 = w_1+w_2+w_3\)とします。1行目と2行目の値を適切に決めると3行目はただ1通りに決まります。 1行目の値を\(x,y,z\)、2行目の値を\(p,q,r\)とすると条件は次のようになります。

\(x+y+z=h_1\)
\(p+q+r=h_2\)
\(x+p \le w_1-1\)
\(y+q \le w_2-1\)
\(z+r \le w_3-1\)
\(x,y,z,p,q,r\)は正の整数

\((x,y,z)\)を決めたとき条件を満たす\((p,q,r)\)の個数は包除原理によって定数時間で求めることができます。(包除原理のやり方は ABC248C を参考にしてください。)
よって\((x,y,z)\)を全探索することでこの問題を\(O(N^2)\)て解くことができました。
また\(O(N^2)\)の解法を主客転倒を用いて高速化する事により\(O(N)\)でも解くことができます。(ただし答えが大きくなるので64bitに収まらない可能性はあります。)

posted:
last update: