解题思路
设
f
i
,
j
f_{i,j}
fi,j表示球传了
j
j
j次,传到第
i
i
i个人手上
很明显,第
i
i
i个人可以从左右两边传过来
f
i
,
j
=
f
i
−
1
,
j
−
1
+
f
i
+
1
,
j
−
1
f_{i,j} = f_{i-1,j-1}+f_{i+1,j-1}
fi,j=fi−1,j−1+fi+1,j−1
特别的,因为是围成一圈,要对
1
1
1和
n
n
n之间的传球做点处理
一开始是从
1
1
1开始传(
f
1
,
0
=
1
f_{1,0}=1
f1,0=1)
所以最终答案是
f
1
,
m
f_1,m
f1,m
Code
#include <iostream>
#include <cstdio>
using namespace std;
int n, m;
long long f[50][50];
int check (int x){
if (x == 0) return n;//如果是0,证明是1传向左边,那就是n
if (x == n + 1) return 1;//如果是(n+1),证明是n传向右边,那就是1
return x;
}
int main(){
scanf ("%d%d", &n, &m);
f[1][0] = 1;
for (int j = 1; j <= m; j++)
for (int i = 1; i <= n; i++)
f[i][j] = f[check(i - 1)][j - 1] + f[check(i + 1)][j - 1];
printf ("%lld", f[1][m]);
}