#include<bits/stdc++.h> using namespace std; typedef long long ll; const int mod=1000000007; ll qpow(ll a,ll b) { ll r=1; a%=mod; while(b) { if(b&1) r=(r*a)%mod; a=(a*a)%mod; b>>=1; } return r; } int main() { int n,m; scanf("%d%d",&n,&m); if(n==1) { printf("0\n"); return 0; } if(m==1) { printf("1\n"); return 0; } ll dp[2][n+1][2]; for(int i=0;i<=1;++i) for(int j=0;j<=n;++j) dp[i][j][0]=dp[i][j][1]=0; dp[1][1][0]=m; for(int i=2;i<=n;++i) { for(int j=1;j<=min(m,i);++j) { //dorzucamy element którego nie w naszym zbiorze, nie zwiększa nam to gdzie możemy zacząć dp[i&1][j][0]+=dp[(i^1)&1][j][0] * (m-j) + dp[(i^1)&1][j-1][1] * (m-j+1); //dorzucamy nowy element do zbioru na którym możemy zacząć dp[i&1][j][0]%=mod; dp[i&1][j][1]+=(dp[(i^1)&1][j][0]+dp[(i^1)&1][j][1])*j; dp[i&1][j][1]%=mod; } int li=min(n,min(m,i)+1); for(int j=0;j<=n;++j) dp[(i^1)&1][j][0]=dp[(i^1)&1][j][1]=0; } ll wy=0; for(int i=1;i<=min(m,n);++i) { wy+=dp[n&1][i][1]; wy%=mod; } // printf("\n"); printf("%lld\n",wy); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include<bits/stdc++.h> using namespace std; typedef long long ll; const int mod=1000000007; ll qpow(ll a,ll b) { ll r=1; a%=mod; while(b) { if(b&1) r=(r*a)%mod; a=(a*a)%mod; b>>=1; } return r; } int main() { int n,m; scanf("%d%d",&n,&m); if(n==1) { printf("0\n"); return 0; } if(m==1) { printf("1\n"); return 0; } ll dp[2][n+1][2]; for(int i=0;i<=1;++i) for(int j=0;j<=n;++j) dp[i][j][0]=dp[i][j][1]=0; dp[1][1][0]=m; for(int i=2;i<=n;++i) { for(int j=1;j<=min(m,i);++j) { //dorzucamy element którego nie w naszym zbiorze, nie zwiększa nam to gdzie możemy zacząć dp[i&1][j][0]+=dp[(i^1)&1][j][0] * (m-j) + dp[(i^1)&1][j-1][1] * (m-j+1); //dorzucamy nowy element do zbioru na którym możemy zacząć dp[i&1][j][0]%=mod; dp[i&1][j][1]+=(dp[(i^1)&1][j][0]+dp[(i^1)&1][j][1])*j; dp[i&1][j][1]%=mod; } int li=min(n,min(m,i)+1); for(int j=0;j<=n;++j) dp[(i^1)&1][j][0]=dp[(i^1)&1][j][1]=0; } ll wy=0; for(int i=1;i<=min(m,n);++i) { wy+=dp[n&1][i][1]; wy%=mod; } // printf("\n"); printf("%lld\n",wy); } |