HDU 2524 矩形A + B

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2524

感受:看到题目的时候感觉一点思路都没有,baidu之后也就明白了。这样做是不是错误的?碰到没什么想法的题目就百度,似乎不是什么好习惯。这道题目是不是属于找规律类型的呢?这两天几只大牛都去省赛了,等他们回来请教请教。

 

[转载+小修改]:http://www.cnblogs.com/jaskist/archive/2009/05/13/1456311.html

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

用矩阵来分析一下题目。

设一矩阵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

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

#include<iostream>
using namespace std;

int main()
{
	int n,m,time;
	cin>>time;
	while(time--)
	{
		cin >> n >> m ;
		cout << (n*(1+n)*m*(1+m))/4 <<endl;
	}
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值