HDU 2524 矩形A + B(矩阵)

点击打开链接

分析:应该是简单题一个吧。

用矩阵来分析一下题目。

设一矩阵d[i,j],d[i,j]表示为网格grid[i,j]中,所有矩形含有第[i,j]此格的总数。

d的其中一些数据为:

 

 

1

2

3

4

1

1

2

3

4

2

2

4

6

8

3

3

6

9

12

4

4

8

12

16

发现是很有规律的,值等于行号乘列号。并且每一行(列)都是一个等差数列。

继续说下去的时候,先加入一个函数g(n,m),

g(n,m) = d[n,1]+d[n,2]+d[n,3]+...+d[n,m] = (d[n,1]+d[n,m])*m/2

           = (d[n,1]+d[n,1]*m)*m/2 = (n+n*m)*m/2

           = n*(m+m^2)/2。

简单点说,就是d矩阵里面的第n行,前m个和。

 

好了,然后再看另一个矩阵sum[i,j],sum[i,j]就是题目要求的答案。

 

 

1

2

3

4

1

1

3

6

10

2

3

9

18

30

3

6

18

36

60

4

10

30

60

100

再次新发现,sum[i,j]的值也是有规律的。例如:sum[3,3] = g(3,3) + g(2,3) + g(1,3)。

所以得到

sum[n,m] = g(1,m) + g(2,m) + g(3,m) + ... + g(n,m)

               = 1*(m+m^2)/2 + 2*(m+m^2)/2 + 3*(m+m^2)/2 + ... + n*(m+m^2)/2

               = ((1+n)*n/2)*((m+m^2)/2)            提取因子

               = (n+n^2)*(m+m^2)/4

好了,有这个公式可以直接代码了。

 

代码:
#include <stdio.h>
int main()
{
    int t,n,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d",&n,&m);
        printf("%d\n",n*(n+1)*m*(m+1)/4);
    }
    return 0;
}


posted on 2012-08-06 16:11  Slege  阅读(171)  评论(0编辑  收藏  举报

导航