SRM146 DIV1 300
数学题,分析如下:
宽度w、高度h的矩形(包括正方形)在宽度width、高度height的矩形中所含个数是:\( (width-w+1)(height-h+1) \)
因此所求不等边矩形个数:
\( \begin{equation} \begin{split} sum &= \sum_{w=1}^{width} \sum_{h=1}^{height} (width-w+1)(height-h+1) - \sum_{w=1}^{min(width,height)}(width-w+1)(height-w+1) \\ &= \sum_{w=1}^{width} \sum_{h=1}^{height} width*height - \sum_{w=1}^{min(width,height)}(width-w+1)(height-w+1) \\ &= (1+width)width/2*(1+height)height/2 - \underline{\sum_{w=1}^{min(width,height)}(width-w+1)(height-w+1))} \end{split} \end{equation} \)
注意下划线所指式子要用程序循环累加来计算
1 class RectangularGrid: 2 def countRectangles(self, width, height): 3 mn = min(width, height) 4 return int((1+width)*width/2) * int((1+height)*height/2) - countSquares(width,height) 5 6 7 def countSquares(width, height): 8 sum = 0 9 k = min(width, height) 10 for x in range(1, k+1): 11 sum += (width-x+1) * (height-x+1) 12 return sum 13 14 15 # test 16 o = RectangularGrid() 17 18 # test case 19 assert(o.countRectangles(3,3) == 22) 20 assert(o.countRectangles(5,2) == 31) 21 assert(o.countRectangles(10,10) == 2640) 22 assert(o.countRectangles(1,1) == 0) 23 assert(o.countRectangles(592,964) == 81508708664)
PS:好多人直接用O(width*height)的算法累加来计算的,比赛中为了编码速度,应该是可以接受的吧