UVa 11538 象棋中的皇后
阿新 • • 發佈:2019-02-18
最近發現自己沒有什麼長進,一直在徘徊中,發現自己的知識儲備太少,簡直菜的不行,目前在看組合數,排列,加法,乘法,容斥原理。
題目通過三個方面考慮:
同一行放兩個皇后的方案數為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)有點麻煩。一下為證明過程:
在這裡還使用到了一個數學公式:
題目程式碼如下:
#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; }