一些基本的计数方法
三大原理: 加法原理、乘法原理、容斥原理
容斥原理:奇数个集合为正,偶数个集合为负
有重复元素的全排列。有k个元素,其中第i个有ni个,求全排列的的个数
(n1+n2+......+nk)!/(n1! n2! ......nk!)
可重复选择的组合。有n个不同的元素,每个元素可以选多次,一共选K个,有多少 种方法
C(n+k-1,n-1)=C(n+k-1,k)
1.加法原理的应用:
UVA11538链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2533
解题思路:
以水平为例,放白后有nm种,放黑后有(m-1)种
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { long long n,m; while(cin>>n>>m) { if(n==0&&m==0) break; if(n>m) swap(n,m); cout<<n*m*(m-1)+n*m*(n-1)+2*n*(n-1)*(3*m-n-1)/3<<endl; } return 0; }
2.加法问题的一类变形
UVA11401 链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2396
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=1000000+10; long long f[maxn]; int main() { f[3]=0; for(long long x=4;x<=1000000;x++) f[x]=f[x-1]+((x-1)*(x-2)/2-(x-1)/2)/2; int n; while(cin>>n) { if(n<3) break; cout<<f[n]<<endl; } return 0; }