SRM377 Div2 500
問題
0からwidth、0からheightの長方形の内部にある整数のすべての点(x,y)の集合をrectangular latticeと定義する。このlatticeの4点のみを使って正方形の角の4点を決める時、できる正方形の個数を返す。
考え方
x,y軸に並行な正方形の数は、widthとheightで大きい方をn、小さい方をmとすると、
for(int i=1; i<=m; i++) ret += (m-i+1)*(n-i+1); //(1)
並行でない正方形の数は、2点を決定して、その正方形の個数を計算すると、
for(int i=1; i<m; i++){ for(int j=1; j<m; j++){ if(i+j<=m){ ret += (m-(i+j)+1)*(n-(i+j)+1); } } }
となるが、このままではTLEなので、さらに書き換えて、
for(int i=2; i<=m; i++) ret += (i-1)*(m-i+1)*(n-i+1); //(2)
とする。
上記の(1)と(2)を足したものが答えになる。
ちなみに、この2つをさらにまとめると、
for(int i=1; i<=m; i++) ret += (ll)(i)*(width-i+1)*(height-i+1);
だけでよい。