UVA 11538 排列组合

https://vjudge.net/problem/UVA-11538#author=0

  将两个不同的皇后放入N*M棋盘中,问使得二者可以相互攻击的方案个数。有可能在同一行,同一列,同一对角线,分开讨论。

令ans=A(N,M)+B(N,M)+D(N,M);  显然 A(N,M)=N*M*(M-1), B(N,M)=A(M,N)=N*M*(N-1).对于对角线我们只考虑一面的然后乘以二就好了,

观察可得对角线长度的变化是1,2,3..n,n,n....3,2,1 ,其中n的个数是n-m+1个, 则D(N,M)=2*{2*SUM(i*(i-1)) +((m-n+1)*n*(n-1))  |1<=i<=n-1}

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 int main()
 5 {
 6     LL N,M;
 7     int i,j,k;
 8     while(cin>>N>>M){
 9         if(N==0&&M==0) break;
10         if(N>M) swap(N,M);
11         cout<<N*M*(N+M-2)+2*N*(N-1)*(3*M-N-1)/3<<endl;
12     }
13     return 0;
14 }
原文地址:https://www.cnblogs.com/zzqc/p/7768189.html