还是排列组合。只要知道这个:对于这个棋盘的小矩形,假设是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;
}
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;
}