本人水平有限,題解不到爲處,請多多諒解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 }