码迷,mamicode.com
首页 > 其他好文 > 详细

uva 11538 Chess Queen

时间:2015-08-05 14:55:48      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:uva 11538   chess queen   

//	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

标签:uva 11538   chess queen   

原文地址:http://blog.csdn.net/timelimite/article/details/47295691

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!