关键在于找出递推关系式,i个人组成m对可以认为是先排列最高的i-1个人,然后再安排最矮的那个同学。
于是,i个人组成m对有两种情况:(i-1)个人先组成(m-2)对,然后最矮的人插在彼此的间隙中,此时不会对原来的对数造成任何影响(因为这是最矮的)
另一种情况是,(i-1)个人先组成(m-1)对,然后最矮的人照在两侧,此时也不会对原来的对数产生任何影响,而且只增加了一对。
#include<iostream>
using namespace std;
int main(){
int n,m,dp[85][10005];
for(int i=0;i<85;i++)
for(int j=0;j<10005;j++)
dp[i][j]=0;
dp[2][1]=2;
dp[1][0]=1;
for(int i=3;i<=80;i++)
for(int j=0;j<=10000;j++){
if(j>=2)
dp[i][j]=(dp[i-1][j-2]*(i-2))%9937;
if(j>=1)
dp[i][j]=(dp[i][j]+dp[i-1][j-1]*2)%9937;
}
while(cin>>n>>m){
if(n==0&&m==0)
break;
cout<<dp[n][m]<<endl;
}
//system("pause");
return 0;
}