题目描述:
橙子姐姐是东秦有名的围棋高手当他打败东秦所有围棋高手后,独自对着棋盘发呆。他发现,他下的奇葩围棋棋盘由m*n(1<m,n<10000)个点组成了若干个正方形(每个小格子都是1个正方形),现在橙子姐想知道这个棋盘中有多少个正方形。图为19*19的棋盘
输入:
第一行输入t(1<=t<=15)表示有t组输入数据,接下来的t行每组占1行每行2个数m和n
输出:
每组输出数据占一行,每行输出一个数代表正方形个数。
样例输入
3 19 19 233 666 1000 1000
样例输出
2109 15892464 332833500
思路:每行格数为m,每列个数为n,边长为a(即组成正方形每边的格子数),以横、纵都为5个格组成的棋盘为例;
(1)对于行,a为1时每行有5种组成,a为2时每行有4种组成,a为3时每行为3个,以此类推可以得出每行的个数符合(m-a+1)的规律;
(2)同理可得,每列的个数符合(n-a+1)的规律;
(3)每行有(m-a+1)个,一共有(n-a+1)行,即用行的个数乘以列的个数得出的即为边长为a时有多少个正方形;
(4)a从1开始,到5结束(提示:当m与n不相等时,为组成正方形,a最大只能等于m,n中较小的数),将a等于不同值时的结果相加,最终结果即为共有的正方形数。
注意:从题中可以得知,19*19的棋盘行、列均由18个格组成,因此,输入的m与n需要减1后再进行计算。
#include<stdio.h>
int main()
{
int m,n,i,a,j,x;
long int s;
scanf("%d",&x);
for(i=0;i<x;i++)
{
s=0;a=1;
scanf("%d %d",&m,&n);
m=m-1;
n=n-1;
while(a<=m&&a<=n)
{
s+=(n-a+1)*(m-a+1);
a++;
}
printf("%ld\n",s);
}
return 0;
}