https://vjudge.net/problem/UVA-11538
题意:输出nm棋盘上放置两个互相攻击的皇后的个数。
题解:
分三种情况:1 、在同一行上放皇后,A(n,m)种
2、在同一列放皇后,B(n,m)种
3、在斜对角线上放皇后,D(n,m)种
其中,A(n,m)=nm(m-1):先选其中一行,共有n种选择,然后在m列中进行排列。
同理,B(n,m)=mn(n-1).
对于情况3,假设n<=m;所有/方向的对角线,从左到右的长度为1,2,3,……n-1,n,n,……n,n(m-n+1个n),n-1,n-2,n-3……,3,2,1;
对于长度为i的对角线,进行排列,i(i-1)种方式。
那么这种对角线总和为:
由于有两种对角线,还要乘以2
#include<stdio.h>
#include<algorithm>
#include <string.h>
using namespace std;
typedef long long LL;
int main()
{
LL n,m,ans;
while(scanf("%lld%lld",&n,&m)!=EOF,n+m)
{
ans=n*m*(m-1)+m*n*(n-1);
if(n>m) swap(n,m);
printf("%lld\n",ans+2*n*(n-1)*(2*n-4)/3+2*(m-n+1)*n*(n-1));
}
}