本人水平有限,题解不到为处,请多多谅解c++
本蒟蒻谢谢你们观看spa
题目:code
比赛排名blog
(rank.cpp/in/out 1s 128M)it
N个同窗参加比赛,问有多少种排名状况,容许出现并列的状况class
Inputim
输入一个数字N,N<=12di
Output比赛
输出有多少种排名状况co
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<bits/stdc++.h> 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 }