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 ",dp[n][m]); } return 0; }