题目大意:
在一个R行C列的表格要选出3个不同的单元格A,B,C。定义这种选择的“费用”= f[A][B] + f[B][C] + f[C][A],f[X][Y]是指X到Y的距离,即X,Y所在行编号的差的绝对值 + X,Y所在列编号的差的绝对值。求出在min~max费用范围内有多少个这种选择。
题解:
ans:=6* (r-2) * (c-2) * (r-i+1) * (c-j+1);
1.因为其实单元格可以看做一个个点,而单元格A,B,C三个点可以构成一个三角形,这个三角形所处位置是一个矩形,而推理可知矩形的周长就是它的费用,如果他的费用在min~max之间就进行下一步。
2.对于一个矩形,题目要求都不在点同一行同一列所以矩形的构成这时有2种情况:
(1)一个点在端点上,2个点分别在这个点在矩形中所不相邻的2条边上,这时候有1 * (r-2)* (c-2)中情况。
以上因为矩形端点有4个,所以情况要* 4,为4 * (r-2) * (c-2)。
(2)2个点在端点上,这时候因为题意不能有2点在同一列或同一行,所这2个点矩形的对角线,而这个时候矩形的4条边都不能出现第3个点,这时候点在这条对角线构成的矩形中,有(r-2) * (c-2)的情况。
以上因为矩形有2条对角线,所以情况要 * 2,为2 * (r-2) * (c-2)
2种情况相加得来构成这种矩形的3个点方案情况有6*(r-2) * (c-2)种,然后求出在表格中这种矩形的数量(r-i+1) * (c-j+1)相乘,累加,取模就是答案。
时间复杂度:O(n^2)
var
x,y,i,j:longint;
r,c,ans:int64;
begin
assign(input,'table.in');reset(input);
assign(output,'table.out'); rewrite(output);
readln(r,c,x,y);
for i:=3 to r do
begin
for j:=3 to c do
if (i+j-2)*2>=x then
if (i+j-2)*2<=y
then ans:=ans+6*(i-2)*(j-2)*(r-i+1)*(c-j+1);
ans:=ans mod 1000000007;
end;
writeln(ans);
close(input); close(output);
end.