【题意】
给定一个棋盘,在棋盘上放两个皇后(一百一黑),求使得两个皇后相互攻击(在一行、一列或对角线)的方案数。
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; }