题意:给出皇后的放置方法:同行、同列、同对角线,让求n*m棋盘里面放两皇后的情况总数。
思路:
同行的: n*m*(m-1)
同列的: m*n*(n-1)
对角线的则比较复杂了:
例如右上方的,对角线长度分别为1、2、3……n-1
长度为i的皇后情况有i*(i-1)种,所以为∑i*(i-1)
然后又有左下方、右下方、左上方,即4*∑
然后长度为n的有m-n+1(设m>n)(规律)
此时的皇后情况为(m-n+1)*n*(n-1)
最后对角线的情况就是2*n*(n-1)*(3*m-n-1)/3,,(我没算这个……
即n*m*(n+m-2) + 2*n*(n-1)*(3*m-n-1)/3
注意范围ull
/*
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
unsigned long long n,m;
while(cin >> n >> m)
{
if(!n && !m)
break;
if(n > m)
swap(n,m);
cout << n*m*(n+m-2) + 2*n*(n-1)*(3*m-n-1)/3 <<endl;
}
return 0;
}