比赛排名 【组合数】

本人水平有限,题解不到为处,请多多谅解

本蒟蒻谢谢大家观看

题目:

比赛排名

(rank.cpp/in/out 1s 128M)

N个同学参加比赛,问有多少种排名情况,允许出现并列的情况

Input

输入一个数字N,N<=12

Output

输出有多少种排名情况

Sample Input

2

Sample Output

3

HINT

设两名同学为A,B,则排名情况有以下三种

1:A第一名,B第二名

2:A第二名,B第一名

3:A,B并列第一名

f(i)表示i个同学参加比赛,问有多少种排名情况,允许出现并列的情况

可以考虑下第一名的几个人,可以有一个人,则结果为c(n,1)*f(n-1) 因为已经取走1人

可以有2个人,则结果为c(n,2)*f(n-2) 因为已经取走2人

可以有3个人,则结果为c(n,3)*f(n-3) 因为已经取走3人

……

可以有n个人,则结果为c(n,n)*f(0) 取走n人

ans等于以上情况进行相加

code:

1 #include

2 using namespace std;

3 long long a[210];

4 long long C(long long m,long long n)//C (m中取n)

5 {

6 long long ans=1;

7 for(long long i=1;i<=n;i++)

8 ans=ans*(m-i+1)/i;

9 return ans;

10 }

11 signed main()

12 {

13 long long n,t;

14 scanf("%lld",&n);

15 a[1]=a[0]=1;

16 for(long long k=2;k<=n;k++)

17 {

18 for(long long i=1;i<=k;i++)

19 {

20 a[k]+=a[k-i]*C(k,i);

21 }

22 }

23 printf("%lld\n",a[n]);

24 return 0;

25 }