您的位置:首页 > 产品设计 > UI/UE

uva 11538 Chess Queen

2015-08-05 13:20 260 查看
//	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;
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: