uva 11538 Chess Queen

5 篇文章 0 订阅
//	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;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值