最近发现自己没有什么长进,一直在徘徊中,发现自己的知识储备太少,简直菜的不行,目前在看组合数,排列,加法,乘法,容斥原理。
题目通过三个方面考虑:
同一行放两个皇后的方案数为A(n,m);
同一列放两个皇后的方案数为B(n,m);
同一对角线放两个皇后的方案数为D(n,m);
对于A(n,m)=n*m(m-1);
对于B(n,m)=n*m(n-1);
对于D(n,m)有点麻烦。一下为证明过程:
![](https://i-blog.csdnimg.cn/blog_migrate/d053956e888de9640281751edfa4207c.jpeg)
在这里还使用到了一个数学公式:
![](https://i-blog.csdnimg.cn/blog_migrate/1eca9fd5b0da80ea75a041c0298f52a4.png)
题目代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll maxn=1e7+10;
int main()
{
ios::sync_with_stdio(false);
ll n,m;
while(cin>>n>>m){
if(n==0&&m==0)break;
if(n>m)swap(n,m);
cout<<n*m*(m+n-2)+2*n*(n-1)*(3*m-n-1)/3<<endl;
}
return 0;
}
好好努力,为自己多储存点东西;