排列组合是组合学最基本的概念。
排列数:从n个不同物体不重复地取出r个做排列的方法数A(n,r)=P(n,r)
组合数:从n个不同物体不重复地取出r个做组合的方法数C(n,r)
求排列数代码:例子:A(5,3)= 5! / (5-3)! long long A(int n,int r) { long long sum=1; for (long long i=n;i>=(n-r+1);i--) { sum*=i; } return sum; }
求组合数代码:例子C(5,3)=5! / [(5-3)! * 3!] long long C(int n,int r) { long long sum=1; for (long long i=1;i<=r;i++) { sum=sum*(n-i+1)/i; } return sum; }
应用举例:从1到300中随便选出3个数,使这三个数的和恰好能被3整除。试问有多少种方法??
解析:
可以把1到300分成三组,分别是:
A={1,4,7,~~,298}
B={2,5,8,~~,299}
C={3,6,9,~~,300}
最终解可以分成两种情况:
1.从A,B,C中各选出一个
2.三个数都从同一个集合中选出
最终解:S=3 * C(100,3) + 100^3 = 1485100(种)