排列组合是组合学最基本的概念。

排列数:从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(种)