该问题为环形排列组合问题,可以使用动态规划来解决。定义一个二维数组dp,其中dp[i][j]表示从小蛮手里开始传球,经过j次传球后,传到第i个同学手里的方法数。根据题目的规则,可以得到状态转移方程如下:
dp[i][j] = dp[(i-1+n)%n][j-1] + dp[(i+1)%n][j-1] # 该节点的次数等于从左右传过来的次数和
初始条件为dp[0][0] = 1,即从小蛮手里开始传球,经过0次传球,传到小蛮手里的方法数为1。
根据状态转移方程,可以使用一个二维数组来计算所有的dp[i][j]值,然后返回dp[0][m],即从小蛮手里开始传球,经过m次传球后,又回到小蛮手里的方法数。
python实现为:
def countPassMethods(n, m):
dp = [[0] * (m + 1) for _ in range(n)]
dp[0][0] = 1
for j in range(1, m + 1):
for i in range(n):
dp[i][j] = dp[(i-1+n)%n][j-1] + dp[(i+1)%n][j-1]
return dp[0][m]
n,m = map(int,input().split(" "))
ret = countPassMethods(n,m)
print(ret)