题意:A、B两人赛马,最终名次有三种可能:并列第一;A第一,B第二;B第一,A第二。输入n,求 n 人赛马时最终名次的可能,结果对10056取余
分析:对于 i 匹马来说,有 i 中可能,设dp[i][j]表示 i 匹马,j次到达的方案数,递推方程式 dp[i][j] = j * dp[i - 1][j] + j * dp[i -1][j - 1] 对于第i匹马来看有两种可能一是自已一个到达,所以j * dp[i - 1][j - 1],因为不知道是第几次到达,j中可能;二是 和其他的一起到达 dp[i - 1][ j ] * j;
1 #include <cstring> 2 #include <iostream> 3 4 #include <cstdio> 5 using namespace std; 6 const int Mod = 10056; 7 const int Max = 1000; 8 int dp[Max + 10][Max + 10]; 9 int sum[Max + 10]; 10 void init() 11 { 12 memset(dp, 0, sizeof(dp)); 13 dp[0][0] = 1; 14 for(int i = 1; i <= Max; i++) 15 { 16 int ans = 0; 17 for(int j = 1; j <= i; j++) 18 { 19 dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j]) % Mod * j % Mod; 20 ans = (ans + dp[i][j]) % Mod; 21 } 22 sum[i] = ans; 23 } 24 } 25 int main() 26 { 27 int test, n; 28 init(); 29 scanf("%d", &test); 30 for(int t = 1; t <= test; t++) 31 { 32 scanf("%d", &n); 33 printf("Case %d: %d\n", t, sum[n]); 34 } 35 }