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 }