http://icpc.upc.edu.cn/problem.php?cid=1674&pid=1
用f[i][j]表示第i次传到第j个人手里的方法总数
动态转移方程:f[i][j] = f[i-1][j-1]+f[i-1][j+1];(还要对环做一下处理)
边界:f[0][1] = 1;
解:f[m][1];
#include <iostream>
using namespace std;
int n, m;
int f[1001][1001];
int main() {
cin >> n >> m;
f[0][1] = 1;
for(int i=1; i<=m; i++)
for(int j=1; j<=n; j++) {
int left = j==1?n:j-1;
int right = j==n?1:j+1;
f[i][j] = f[i-1][left] + f[i-1][right];
}
cout << f[m][1] << endl;
return 0;
}
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int f[100][100],n,m,i,j,k,ans1,ans;
int main(){
scanf("%d%d",&n,&m);
f[1][n]=1;
f[1][2]=1;
f[1][0]=1;
for (i=2;i<=m;i++)
for (j=1;j<=n;j++){
f[i][j]=f[i-1][j-1]+f[i-1][j+1];
f[i][0]=f[i][n];
f[i][n+1]=f[i][1];
}
printf("%d",f[m][1]);
}