题型:数学
题意:n*m的格子中画正方形,正方形的顶点在格点上。问对于n*m的格子,可以画出多少个面积为奇数的正方形。
分析:
首先可以看出一些简单的结论:
设n<m,
(1) n*m中可以画出的正方形,只能是n*n中可以画出的正方形。
(2) n大的中包含n小的图中的正方形,并且可能能够画出更大的正方形。
(3) n*m中一定有n*m个1*1的正方形。
我们总结一些答案看看有木有规律(以下的正方形均为面积为奇数的正方形)
1*1包含顶点占据边上的正方形有1个
2*2没有
3*3包含顶点占据边上的正方形有3个
4*4没有
5*5包含顶点占据边上的正方形有5个
6*6没有
7*7包含顶点占据边上的正方形有7个
......
可以发现,对于n*n,n为偶数时不能画出顶点在边上格点的正方形;n为奇数时能画出。
这样我们可以枚举n*m内所有的奇数i*i的子正方形,然后就出答案。
举个例子,如何求出5*4中3*3的子正方形的个数呢?
3*3在4长度的边上有2个,在5长度的边上有3个,那么5*4中就包含6个3*3正方形。
注意答案需要long long表示。
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL inf=0x3f3f3f3f3f3f3f3fLL;
int main(){
LL n,m;
while(~scanf("%lld%lld",&n,&m),n|m){
LL ans=0;
LL big=min(n,m);
for(LL i=3;i<=big;i+=2){
ans+=i*(1+n-i)*(1+m-i);
}
ans+=n*m;
printf("%lld\n",ans);
}
return 0;
}