题目背景
1997年普及组第一题
题目描述
有一个n×m 方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。
输入格式
一行,两个正整数 n,m(n≤5000,m≤5000)。
输出格式
一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正方形)。
输入输出样例
输入 #1复制
2 3
输出 #1复制
8 10
思路:
首先求出所有矩形的个数,然后求出正方形的个数
最后长方形的个数就是所有矩形的个数减去正方形的个数
所有矩形的个数:
所有下标相乘再累加的结果就是所有矩形的个数
正方形个数:
边长为1 个数n*m
边长为2 个数(n-1)*(m-1)
边长为3 个数(n-2)*(m-2)
.............................
边长为x 个数(n-x)*(m-x)
注意 x 的最大值取决于n,m中最小的那个数,我们用 min 表示 n,m 中最小的数,那么 x 最大可以取到min-1 (可以自己动手画一个矩形,找下规律)
代码:
#include<stdio.h>
int main()
{
long long n,m,sum=0,i,j,sum1=0,cnt=0,min;
scanf("%lld%lld",&n,&m);
if(n < m)
min = n;
else
min = m;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
sum += i*j;
if(cnt<min)
{
sum1+=(n-cnt)*(m-cnt);
cnt++;
}
}
}
printf("%lld %lld",sum1,sum-sum1);
return 0;
}
遇到的问题:
一开始不太明白变量为什么要使用long long型,我们假设n=m=5000,那么sum的和就为(1+25000000)/2*5000=62500002500(一共十一位) ,所以必须用long long型
除此之外,因为所有变量间都有赋值关系,所以都要定义为long long型
体会:
对于我这个小白来讲,暴力枚举好难啊T_T