#include <iostream>
#include <cmath>
using namespace std;
long long dp[3000][3000];
int main() {
long long modulo = 1000000007;
long long n,m, ans = 0;
cin>>n>>m;
for(int i=0; i<=n-1; ++i) {
dp[i][0] = 0;
dp[0][i] = 0;
dp[1][i] = 0;
}
dp[1][1] = m;
for(int i=2; i<=n-1; ++i)
for(long long j=1; j<=n-1; ++j) {
dp[i][j] = dp[i-2][j-1] * (((long long)(max((int)(m-j+1),0)) * (j-1)) % modulo) + dp[i-1][j] * m + dp[i-2][j] * (((j-m) * j) % modulo);
dp[i][j] = dp[i][j] % modulo;
}
for(long long k=1; k<=n-1; ++k) {
ans += dp[n-1][k] * k;
}
ans = ans % modulo;
if(ans < 0) ans += modulo;
cout<<ans<<endl;
return 0;
}
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 | #include <iostream> #include <cmath> using namespace std; long long dp[3000][3000]; int main() { long long modulo = 1000000007; long long n,m, ans = 0; cin>>n>>m; for(int i=0; i<=n-1; ++i) { dp[i][0] = 0; dp[0][i] = 0; dp[1][i] = 0; } dp[1][1] = m; for(int i=2; i<=n-1; ++i) for(long long j=1; j<=n-1; ++j) { dp[i][j] = dp[i-2][j-1] * (((long long)(max((int)(m-j+1),0)) * (j-1)) % modulo) + dp[i-1][j] * m + dp[i-2][j] * (((j-m) * j) % modulo); dp[i][j] = dp[i][j] % modulo; } for(long long k=1; k<=n-1; ++k) { ans += dp[n-1][k] * k; } ans = ans % modulo; if(ans < 0) ans += modulo; cout<<ans<<endl; return 0; } |
English