提交时间:2024-01-11 12:41:27
运行 ID: 24627
#include<bits/stdc++.h> #define int long long using namespace std; int n,m; const int M=1e9+7; const int MAXN=1e6+10; int fac[2*MAXN],iv[2*MAXN]; inline int qp(int a,int x){ int res=1; while(x){ if(x&1)res=res*a%M; a=a*a%M; x>>=1; } return res; } inline int inv(int x){return qp(x,M-2);} inline int C(int n,int m){ if(n<m||m<0||n<0)return 0; if(n>2e6){ int fz=1,fm=iv[m]; for(int i=n;i>n-m;i--) fz=fz*i%M; return fz*fm%M; } return fac[n]*iv[m]%M*iv[n-m]%M; } inline int A(int n,int m){ if(n<m||m<0||n<0)return 0; return fac[n]*iv[n-m]%M; } inline int BOX(int n,int m){ return C(n+m-1,m-1); } inline int CAT(int n){ return (C(2*n,n)-C(2*n,n-1)+M)%M; } int f[110][110]; int t[110][110]; inline void add(int &x,int y){ x+=y; if(x>=M)x-=M; } signed main(){ //freopen("life.in","r",stdin); //freopen("life.out","w",stdout); ios::sync_with_stdio(0); //fac[0]=iv[0]=1; // for(int i=1;i<=2e6;i++) // fac[i]=fac[i-1]*i%M,iv[i]=inv(fac[i]); cin>>n>>m; int lim=min(n,m); int res=0; f[0][0]=1; for(int i=1;i<=n;i++){ memset(t,0,sizeof(t)); for(int j=0;j<=lim;j++) for(int k=0;k<=lim;k++){ add(t[j+1][k+1],f[j][k]*(m-k)%M); if(j) add(t[j][k],f[j][k]); if(j) add(t[j-1][k],f[j][k]); add(t[j][k+1],f[j][k]*(m-k)%M); } memcpy(f,t,sizeof(f)); } for(int i=1;i<=lim;i++) add(res,f[0][i]); cout<<res<<endl; return 0; }