此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接(vjudge):https://vjudge.net/problem/UVA-12034
题目大意:
A,B两人赛跑,可能出现三种情况:
1、A,B并列第一 2、A第一,B第二 3、B第一,A第二
现在有N个人赛跑,问可能出现多少种情况,答案对10056取模。
输入格式:
第一行一个数字T(1<=T<=1000),表示数据组数。
接下来T行,每行一个数字N(1<=N<=1000),表示赛跑的人数。
输出格式:
对于每个询问,输出当前的问题序号和答案。
Sample Input
3
1
2
3
Sample Output
Case 1: 1
Case 2: 3
Case 3: 13
分析:
递推。假设有n个人参加赛跑,其中x个人并列第一,那么情况数=C(n,x)*f(n-x)
枚举x计算出所有的情况,加和即可。
刘汝佳《算法竞赛入门经典》
AC代码:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 6 const int MOD = 10056; 7 8 inline void read(int &x) 9 { 10 char ch = getchar(),c = ch;x = 0; 11 while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar(); 12 while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar(); 13 if(c == ‘-‘) x = -x; 14 } 15 16 int f[1005],c[1005][1005]; 17 18 inline void init() 19 { 20 int n = 1000; 21 22 for(int i = 0;i <= n;++ i) 23 {//组合公式 24 c[i][0] = 1,c[i][i] = 1; 25 for(int j = 1;j < i;++ j) 26 c[i][j] = (c[i-1][j]+c[i-1][j-1])%MOD; 27 } 28 f[0] = 1; 29 for(int i = 1;i <= n;++ i) 30 {//i为参加比赛的总人数,j为第x名的人数 31 for(int j = 1;j <= i;++ j) 32 f[i] = (f[i]+(c[i][j]*f[i-j])%MOD)%MOD; 33 } 34 } 35 36 int main() 37 { 38 int t,n; 39 init(); 40 read(t); 41 for(int T = 1;T <= t;++ T) 42 { 43 read(n); 44 printf("Case %d: %d\n",T,f[n]); 45 } 46 return 0; 47 }
时间: 2024-10-29 19:06:18