題目大意:在一個n?m的棋盤上,放兩個皇後,要求兩個皇後可以互相攻擊,求有多少種放法。
解題思路:因為皇後的攻擊范圍為豎線、橫線和斜線,所以枚舉每條上兩個皇後放的位置,比如一條斜線有8個,那麼放兩個皇後的種數就有C(82)種。
行數n,每行m個位置C(m2)?n
列數m,每列n個位置C(n2)?m
斜線,2?(2?∑i=1n?1i?(i?1)+(m?n+1)?n?(n?1)),因為正斜線和翻斜線,所以要乘以2
最後公式化簡為2?n?(n?1)?(3?m?n?1)3
#include
#include
#include
#include
using namespace std;
typedef unsigned long long ll;
ll n, m;
int main () {
while (cin >> n >> m) {
if (!(n + m))
break;
if (m < n)
swap(n, m);
cout << n * m * (n+m-2) + 2 * n * (n-1)*(3*m-n-1)/3 << endl;
}
return 0;
}