2329 - 棋盘方格
时间限制 : 1 秒
内存限制 : 125 MB
设有一个n*m方格的棋盘(1≤m,n≤100)。
求出该棋盘中包含多少个正方形、多少个长方形(不包括正方形)。
例如:
当n=2,m=3时

<br />
正方形的个数有<span>8</span>个,即边长为<span>1</span>的正方形有<span>6</span>个,边长为2的正方形有2个。
长方形的个数有10个:
2*1的长方形有4个;<img src="http://noi.acmclub.com/attached/image/20140109/20140109160025_60435.jpg" alt="" />
1*2的长方形有3个;<img src="http://tk.hustoj.com:80/attached/image/20140109/20140109160119_48455.jpg" alt="" />
3*1的长方形有2个;<img src="http://tk.hustoj.com:80/attached/image/20140109/20140109160140_93063.jpg" alt="" />
3*2的长方形有1个。<img src="http://tk.hustoj.com:80/attached/image/20140109/20140109160158_92741.jpg" alt="" />
<br />
<br />
题目输入
每个测试文件只包含一组测试数据,每组输入两个正整数n和m。
题目输出
对于每组输入数据,出该棋盘中包含的正方形个数和长方形个数。
输入/输出样例
输入格式
2 3
输出格式
8 10
C语言解答
#include<stdio.h> int main() { int n,m,i,j,s=0,k=0,t; scanf("%d%d",&n,&m); if(n>m) { t=n;n=m;m=t; } for(i=0;i<n;i++) s+=(n-i)*(m-i); for(i=0;i<n;i++) for(j=0;j<m;j++) if(i==j) ; else k+=(n-i)*(m-j); printf("%d %d",s,k); return 0; }
C++解答
#include<iostream> #include<cmath> using namespace std; int main() { int t=0,r=0; int m,n,min; cin >> n >> m; min = n>m ? m:n; for(int i=0; i<min; ++i) t+= (n-i)*(m-i); for(int i=0; i<n; ++i) for(int j=0; j<m; ++j) { r+=(n-i)*(m-j); } cout << t << " " << r-t << endl; return 0; }
Java解答
import java.util.Scanner; public class Main { public static int N, M; public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); N = sc.nextInt(); M = sc.nextInt(); int sumz = 0; int sumc = 0; if (N > M) { for (int i = M - 1; i >= 0; i--) { sumz += (N - i) * (M - i); } } else { for (int i = N - 1; i >= 0; i--) { sumz += (N - i) * (M - i); } } // 长方形个数 sumc = N * M * (N + 1) * (M + 1) / 4 - sumz; System.out.println(sumz + " " + sumc); } }