P1548 [NOIP1997 普及组] 棋盘问题
题目描述
设有一个N \times MN×M方格的棋盘(1≤N≤100,1≤M≤100)(1≤N≤100,1≤M≤100)
求出该棋盘中包含有多少个正方形、多少个长方形(不包括正方形)。
思路
可采用枚举暴力和数论推论的方法:
- 暴力枚举
从第一行第一列(0,0)开始枚举,正方形sumn++,长方形summ++。
#include <stdio.h>
#include <stdlib.h>
void method(int n,int m)
{
int sumn=0,summ=0;
for(int i=0; i<=n; i++)
{
for(int j=0; j<=m; j++)
{
for(int a=i+1; a<=n; a++)
{
for(int b=j+1; b<=m; b++)
{
int maxn=a-i;
int maxm=b-j;
if(maxn==maxm)
{
sumn++;
}
else
{
summ++;
}
}
}
}
}
printf("%d %d",sumn,summ);
}
int main()
{
int N,M;
scanf("%d %d",&N,&M);
method(N,M);
return 0;
}
-
数学推论
找规律:设边长n,m
正方形:
边长为1的正方形个数为n*m边长为2的正方形个数为(n-1)*(m-1)
边长为3的正方形为个数(n-2)*(m-2)
以此类推
长方形:(包括正方形,正方形属于长方形)
同理 宽为1的长方形(包括正方形)有m个
宽为2的长方形(包括正方形)有m-1个
宽为m的长方形(包括正方形)有1个
宽为1-m的长方形1+2+…+m个
然后把它们乘起来,根据乘法原理,总数s2=((1+n)*(1+m)nm)/4;
题目要求的是“非正方形的长方形”,因此要减去s1;
#include"cstdio"
#include"iostream"
using namespace std;
int main()
{
int n,m,s1=0,s2;
cin>>n>>m;
s2=((m+1)*(n+1)*m*n)/4;
for(;m>=1&&n>=1;m--,n--)
s1+=m*n;
cout<<s1<<" "<<s2-s1;
return 0;
}