Fancy Mouse
- -|||

还是排列组合。只要知道这个:对于这个棋盘的小矩形,假设是a*b的矩形,那长为a的边在长为N的边中共有N-a+1种选择方式,而a可以取1~N的所有数值,因此对于长的取法是sigma(i=1~N,i) = N*(N+1)/2。同样宽也能取M*(M+1)/2种,于是子矩形可以有M*(M+1)*N*(N+1)/4种。而子正方形的取法就是N*M+(N-1)*(M-1)+...+(N-M+1)*1(如果N>M)
因此很容易写出程序:

#include<iostream>
using namespace std;

#define P(r) (r*(r+1)/2)
int main()
{
    
int N,M,count,temp,n,m;
    cin
>>count;
    
while(count-- > 0)
    
{
        cin
>>N>>M;
        temp
=0;
        
for(n=N,m=M;n>0 && m>0;n--,m--) temp+=n*m;
        cout
<<temp<<' '<<P(N)*P(M)-temp<<endl;
    }

    
return 0;
}
posted on 2005-09-10 21:34  Fancy Mouse  阅读(299)  评论(1编辑  收藏  举报