首页 > 代码库 > UVa 12034 比赛名次(递推)

UVa 12034 比赛名次(递推)

https://vjudge.net/problem/UVA-12034

题意:

A、B两人赛马,最终名次有3种可能:并列第一;A第一B第二;B第一A第二。输入n,求n人赛马时最终名次的可能性的个数除以10056的余数。

 

思路:

设答案为f(n),假设第一名有i个人,接下来就会有f(n-i)种可能性,所以答案为技术分享

 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<queue> 6 using namespace std; 7  8 const int maxn=1000+100; 9 #define mod 1005610 11 int c[maxn][maxn];12 int f[maxn];13 14 void init()15 {16     for(int i=0;i<maxn;i++)17     {18         c[i][0]=1;19         for(int j=1;j<=i;j++)20         {21             c[i][j]=c[i-1][j-1]+c[i-1][j];22             c[i][j]%=mod;23         }24     }25 }26 27 int solve(int n)28 {29     if(f[n])  return f[n];30     for(int i=1;i<=n;i++)31     {32         f[n]+=c[n][i]*solve(n-i);33         f[n]%=mod;34     }35     return f[n];36 }37 38 int main()39 {40     int T;41     scanf("%d",&T);42     init();43     f[0]=1;44     for(int kase=1;kase<=T;kase++)45     {46         int n;47         scanf("%d",&n);48         solve(n);49         printf("Case %d: %d\n",kase,f[n]);50     }51 }

 

UVa 12034 比赛名次(递推)