UVA 11538 Chess Queen

【题意】

给定一个棋盘,在棋盘上放两个皇后(一百一黑),求使得两个皇后相互攻击(在一行、一列或对角线)的方案数。

0< M, N<=106

【题解】

计数问题,分类:

1.在一行或一列:n*m(m-1),m*n*(n-1)

2.在对角线,假设n<m,则各对角线长度:1,2,3……n-1,n,n,……n,n-1,n-2,……1.

n-m+1个n。假设长度为l,则该对角线的方案数:l*(l-1)。将所有的加起来即可。

【Code】

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n,m;
int main()
{
    while(cin>>n>>m,n||m)
    {
        if(n>m)swap(n,m);//保证n比m小
        long long ans=2*n*(n-1)*(3*m-n-1)/3;
        ans+=m*n*(n-1)+n*m*(m-1);
        cout<<ans<<endl;
    }
    return 0;
}


你可能感兴趣的:(UVA 11538 Chess Queen)