提交时间:2024-01-11 15:07:30
运行 ID: 24632
#include<iostream> #include<vector> #include<algorithm> #include<set> using namespace std; #define int long long const int N=310,P=1000000007; inline int fpow(int a,int b=P-2){ int c=1; for(;b;b>>=1,a=a*a%P)if(b&1)c=c*a%P; return c; } int n,m; int fac[N],ifac[N]; inline int c(int n,int m){ if(n<m||m<0)return 0; return fac[n]*ifac[m]%P*ifac[n-m]%P; } void init(){ fac[0]=1; for(int i=1;i<N;i++)fac[i]=fac[i-1]*i%P; ifac[N-1]=fpow(fac[N-1]); for(int i=N-1;i;i--)ifac[i-1]=ifac[i]*i%P; } int f[N][N][N]; signed main(){ // freopen("read.in","r",stdin); // freopen("life.out","w",stdout); cin>>n>>m; init(); f[0][0][0]=1; int s=min(n,m*2); for(int i=0;i<=s;i++){ for(int j=0;j<=s;j++){ for(int k=0;k<=j;k++){ // cout<<f[i][j][k]<<' '; f[i+1][j+1][k+1]=(f[i+1][j+1][k+1]+f[i][j][k]*(m-j))%P; for(int t=1;t<k;t++){ f[i+1][j][t]=(f[i+1][j][t]+f[i][j][k])%P; } } // cout<<endl; } // cout<<endl; } int ans=0; for(int i=1;i<=s;i++){ int res=0; for(int j=1;j<=s;j++) for(int k=1;k<=s;k++)res=(res+f[i][j][k])%P; // cout<<res<<' '<<res*c(n-1,i-1)<<endl; ans=(ans+res*c(n-1,i-1))%P; } cout<<ans; return 0; }