矩形A + B
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2339 Accepted Submission(s): 1779
2 1 2 2 4
3 30
设一矩阵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)=n*m } 。并且每一行(列)都是一个等差数列。
继续说下去的时候,先加入一个函数g(n,m),
g(i,m) = d[i,1]+d[i,2]+d[i,3]+...+d[i,m] = (d[i,1]+d[i,m])*m/2
= (d[i,1]+d[i,1]*m)*m/2 = (i+i*m)*m/2
= i*(m+m^2)/2。
简单点说,就是d矩阵里面的第 i 行的前 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
所以AC代码:
#include<iostream>
using namespace std;
int main()
{
__int64 t,n,m;
while(scanf("%I64d",&t)!=EOF)
{
while(t--)
{
scanf("%I64d%I64d",&n,&m);
printf("%I64d\n",(n+1)*(m+1)*n*m/4);
}
}
return 0;
}