简要题意
给你一个 \(n\times m\) 的棋盘,你需要在棋盘上放置两个颜色不同的皇后,使得它们互相攻击。求方案数。
\(1 \leq n,m \leq 10^6\)
思路
下面假设 \(n\leq m\)。
首先发现,两个互相攻击的皇后大致有下面三种情况:
- 在同一行,方案数为 \(\binom{n}{1}\operatorname{A}^{2}_{m}=nm(m-1)\)。
- 在同一列,方案数为 \(\binom{m}{1}\operatorname{A}^{2}_{n}=nm(n-1)\)。
- 在同一个斜线上,这个比较复杂:
设所在的斜线的长度为 \(S\),则方案数为 \(2A^{2}_{S}=2S(S-1)\)(因为斜线方向有两种)。
斜线长度一共有:
\[1,2,\cdots,n-2,n-1,\underbrace{n,n,\cdots,n,n}_{m-n+1},n-1,n-2,\cdots,2,1 \]所以同一个斜线的方案数就是:
\[\begin{aligned} &2(n(n-1)(m-n+1)+2\sum_{i=1}^{n-1}{i(i-1)})\\ &=2(n(n-1)(m-n+1)+2(\sum_{i=1}^{n-1}i^2-\sum_{i=1}^{n-1}i))\\ &=2(n(n-1)(m-n+1)+2(\frac{n(n-1)(2n-1)}{6}-\frac{n(n-1)}{2}))\\ &=2(n(n-1)(m-n+1)+2(\frac{n(n-1)(2n-4)}{6}))\\ &=2(n(n-1)(m-n+1)+\frac{n(n-1)(2n-4)}{3})\\ &=2\cdot\frac{3n(n-1)(m-n+1)+n(n-1)(2n-4)}{3}\\ &=2\cdot\frac{n(n-1)(3m-3n+3+2n-4)}{3}\\ &=\frac{2n(n-1)(3m-n-1)}{3} \end{aligned} \]于是这道题就做完了。最后答案是:
\[nm(m-1)+nm(n-1)+\frac{2n(n-1)(3m-n-1)}{3} \]单次计算时间复杂度 \(O(1)\)。
代码
点击查看代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
signed main(){
while(cin>>n>>m&&n&&m){
if(n>m) swap(n,m);
int row=n*m*(m-1);
int col=m*n*(n-1);
int xie=2*n*(n-1)*(3*m-n-1);
xie/=3;
cout<<(row+col+xie)<<'\n';
}
return 0;
}