【UVA11538】Chess Queen——简单组合

题意:给你一个 n×m 的棋盘,在上面放两个皇后,(一黑一白)问有多少种放的方法

分析:皇后的攻击的范围为同一行或者同一列或者在同一对角线,这三种情况没有交集,利用加法原理,对于同一行的放置数目为 A(n,m)=n×m×(m1) ,同一列的放置为 B(m,n)=m×n×(n1)
下面来求对角线的部分:假设 nm ,所以对角线的长度依次为 1,2,3,,n1,n,n,n1,n2,,3,2,1 ,所以 D(n,m)=2×[2i=1n1i(i1)+(mn+1)n(n1)] ,其中 i=1n1i(i1)=i=1n1i2i=1n1i=n(n1)(2n1)6n(n1)2=n(n1)(2n4)6 所以 D(n,m)=2n(n1)(2n4)3+(mn+1)n(n1)=2n(n1)(3mn1)3 ,所以 ans=A(n,m)+B(m,n)+D(n,m)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>

using namespace std;

typedef long long LL;

LL n,m;

int main()
{
    while(scanf("%lld %lld",&n,&m)&&(n+m))
    {
        if(n>m)
        {
            swap(n,m);
        }

        cout<<n*m*(m+n-2)+2*n*(n-1)*(3*m-n-1)/3<<endl;
    }
    return 0;
}

你可能感兴趣的:(【UVA11538】Chess Queen——简单组合)