n场比赛,m个场地,m<=n,1场比赛只能选择1个场地,要求每个场地必须使用过一次,求所有的方案数。
dp[i][j]表示:前i场比赛用了j个场地的情况数
dp[i][j]=dp[i-1][j]*j+dp[i-1][j-1]*(m-j+1);
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int MOD=1e9+7;
int main(){
int n,m;
long long dp[105][105];//dp[i][j]表示:前i场比赛用了j个场地的情况数
int i,j;
while(~scanf("%d%d",&n,&m)){
memset(dp,0,sizeof(dp));
for(i=1;i<=n;++i) //j=1;前i场比赛用了1个场地,初始化为m
dp[i][1]=m;
for(i=2;i<=n;++i){
for(j=2;j<=i&&j<=m;++j){
dp[i][j]=((dp[i-1][j]*j)%MOD+(dp[i-1][j-1]*(m-j+1))%MOD)%MOD;
}
}
printf("%lld\n",dp[n][m]);
}
return 0;
}
浙公网安备 33010602011771号