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<int> getWays(int n, int a, int b) {
// write code here
vector<int> res(2, 0);
res[0] = factorial(n-2) * combination(n, 2);
res[1] = factorial(n-1);
return res;
}
};
网友评论