10行代码AC——UVA 11538-Chess Queen(数学规律+数列,附详细讲解)

励志用尽量少的代码做高效表达


提交(题目)连接——>UVA-11538


题目大意

求在n*m棋盘上放2个不一样的皇后,且他们相互攻击的方案数,也就是说,求2个不同的皇后在同一行、同一列或同一对角线的所有情况。

心路历程

看到m、n的取值范围和样例的输出值,太大了!先确定这是一道规律题。 并且用long long存储。

首先找规律,找到规律后要么打表,要么推数学公式。

这道题可以采用分治的思想,将皇后攻击的种类分成三部分考虑:同行攻击,同列攻击和同对角线攻击。最后三部分相加。

同行攻击:皇后A在每行中有n种放法,共m行。但在一行中皇后B只有n-1种放法。相乘得到n*m*(m-1)

同列攻击:同上,最后得:m*n*(n-1)

同对角线:设n≤m,所有/向的对角线,从左到右的长度依次为在这里插入图片描述
有两个方向的对角线,所以要乘2,得到如下公式:在这里插入图片描述
对于在这里插入图片描述

由于:1^2+2^2+3^2...+n^2 前n项和Sn=n(n+1)(2n+1)/6
因此有:S(n-1)=Sn-n=n(2n-1)(n-1)/6

对于在这里插入图片描述

有:Sn=n(a1+an)/2

于是:
在这里插入图片描述


代码展示:

#include<bits/stdc++.h>
using namespace std;
int main() {
    
    
	long long m, n; while(cin>>m>>n && m) {
    
    
		long long sum = 0;
		if(n > m) swap(m,n);
		sum = m*n*(n-1) + n*m*(m-1) + (2*n*(n-1)*(3*m-n-1))/3; 
		cout << sum << endl;
	}
return 0; } 

如果这篇文章对你产生了帮助,就请给博主一个小小的赞吧!大家的点赞是我创作的最大动力!

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/108090293