#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); } |
English