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行,前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)
好了,有这个公式可以直接代码了。
#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; }