// uva 11538 Chess Queen
//
// 题目大意:
//
// 在 n * m 的棋盘中,放两个皇后,一个黑的,一个白的
// 求能让两个皇后相互攻击的放法,有多少种
//
// 解题思路:
//
// 皇后攻击的方式只有在同一行,同一列,或者同一对角线
// 上,分类讨论:
//
// 1): 同一行,则白的放法有 n * m 种,黑的放法有m-1种
//
// 2): 同一列,则白的方法有 m * n 种,黑的放法有n-1种
//
// 3): 同一对角线,则第一个皇后的方法沿对角线依次为
// 1,2,3....n-1,n,....,n,n-1,...,3,2,1,因为对角线
// 一共m+n-1条,两边各有n-1,则放n的有m-n+1种,则
// 对角线上方法为
// sigma(i * (i-1)){ 1<=i<=n-1} * 2+ (m-n+1)*n*(n-1)
// 因为有两条对角线,主对角线和副对角线.这里应该再*2
// 再用unsigned long long 就over啦~~~~
//
// 感悟:
//
// 算法竞赛训练指南上的题目,实在是太美妙啦~~~继续加油~~~
// FIGHTING
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef unsigned long long ull;
int main(){
ull n,m;
//freopen("1.txt","r",stdin);
while(cin >> n >> m){
if (!n && !m)
break;
if (n > m)
swap(n,m);
ull x;
x = n * (n - 1) * (2 * n - 1) / 6;
x = x - n * (n - 1) / 2;
x = x * 2;
x = x + (m - n + 1) * n * (n - 1);
x = x * 2;
x = x + m * n * (m + n - 2);
cout << x << endl;
}
}
uva 11538 Chess Queen
最新推荐文章于 2018-03-26 12:42:47 发布