9_3站队问题

n个人站队,他们的编号依次从1到n,要求编号为a的人必须在编号为b的人的左边,但不要求一定相邻,请问共有多少种排法?第二问如果要求a必须在b的左边,并且一定要相邻,请问一共有多少种排法?

给定人数n及两个人的编号a和b,请返回一个两个元素的数组,其中两个元素依次为两个问题的答案。保证人数小于等于10。

测试样例:
输入:7,1,2
返回:[2520,720]

// 还有另外一种解法,先全排列,a不是在b左边就是在b右边,且这两个的数量相同,所以第一问为:n! / 2,第二问则是把ab捆绑,当做一个人,然后全排列
class StandInLine {
public:
    int factorial(int n)
    {
        if(n == 0) return 1;
        return n*factorial(n-1);
    }

    int permutation(int i, int j)
    {
        return factorial(i) / factorial(i - j);
    }

    int combination(int i, int j)
    {
        return permutation(i, j) / factorial(j);
    }
    vector getWays(int n, int a, int b) {
        // write code here
        vector res(2, 0);
        res[0] = factorial(n-2) * combination(n, 2);
        res[1] = factorial(n-1);
        return res;
    }
};

你可能感兴趣的:(9_3站队问题)