https://vjudge.net/problem/UVA-11538
題意:輸出nm棋盤(pán)上放置兩個(gè)互相攻擊的皇后的個(gè)數(shù)。
題解:
分三種情況:1 、在同一行上放皇后,A(n,m)種
2、在同一列放皇后,B(n,m)種
3、在斜對(duì)角線(xiàn)上放皇后,D(n,m)種
其中,A(n,m)=nm(m-1):先選其中一行,共有n種選擇,然后在m列中進(jìn)行排列。
同理,B(n,m)=mn(n-1).
對(duì)于情況3,假設(shè)n<=m;所有/方向的對(duì)角線(xiàn),從左到右的長(zhǎng)度為1,2,3,……n-1,n,n,……n,n(m-n+1個(gè)n),n-1,n-2,n-3……,3,2,1;
對(duì)于長(zhǎng)度為i的對(duì)角線(xiàn),進(jìn)行排列,i(i-1)種方式。
那么這種對(duì)角線(xiàn)總和為:

由于有兩種對(duì)角線(xiàn),還要乘以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));
}
}