#include <bits/stdc++.h>
using namespace std;
long long n, m, res, t[3001][1501];
const long long MOD = 1e9 + 7;
long long powmod(long long a, long long p) {
long long res = 1, k = a;
while (p > 0) {
if (p % 2) {
res = (res * k) % MOD;
}
k = (k * k) % MOD;
p >>= 1;
}
return res % MOD;
}
long long f(int dl, int l) {
if (t[dl][l] != 0) {
return t[dl][l];
}
if (l >= m) {
t[dl][l] = 0;
return 0;
}
// cout << "t[" << dl << "]["<< l << "]" << endl;
if (m - 2 - l > 0) {
for (int i = 0; i <= dl - 2; i++) {
long long fs = f(dl - i - 2, l + 1);
if (fs == 0) {
break;
}
if (i < dl - 2) {
fs *= (m - 2 - l);
fs %= MOD;
}
t[dl][l] += (powmod(m - 1 - l, i) * fs) % MOD;
// cout << " (m - 2 - l) " << m - 2 - l << " dla i " << i << " " << pow(m - 1 - l, i) << " * " << fs << " = " << (powmod(m - 1 - l, i) * fs) % MOD << endl;
t[dl][l] %= MOD;
}
t[dl][l] *= m - 2 - l;
t[dl][l] %= MOD;
}
if (dl > 1) {
t[dl][l] += pow(m - 1 - l, dl - 1) - 1;
t[dl][l] %= MOD;
// cout << " (+ " << pow(m - 1 - l, dl - 1) - 1 << ") czyli do końca są 1" << endl;
}
// cout << " " << t[dl][l] << " + " << dl << " + " << pow(m - l - 1, dl) << endl;
t[dl][l] += dl;
t[dl][l] %= MOD;
t[dl][l] += pow(m - l - 1, dl);
t[dl][l] %= MOD;
// cout << " t[" << dl << "]["<< l << "] = " << t[dl][l] << endl;
return t[dl][l];
}
int main()
{
ios_base::sync_with_stdio(0);
cin >> n >> m;
if (m == 1) {
cout << 1 << endl;
return 0;
}
if (n == 1) {
cout << 0 << endl;
return 0;
}
long long mn = m;
for (int i = 1; i < n; i++) {
t[0][i] = 1;
mn *= m;
mn %= MOD;
}
res = f(n - 2, 0) * m;
res %= MOD;
res *= m - 1;
res %= MOD;
// cout << mn << " - (" << f(n - 2, 0) << " * " << m << " * " << m - 1 << ")" << endl;
res = mn - res;
if (res < 0) {
res += MOD;
}
cout << res << 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 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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | #include <bits/stdc++.h> using namespace std; long long n, m, res, t[3001][1501]; const long long MOD = 1e9 + 7; long long powmod(long long a, long long p) { long long res = 1, k = a; while (p > 0) { if (p % 2) { res = (res * k) % MOD; } k = (k * k) % MOD; p >>= 1; } return res % MOD; } long long f(int dl, int l) { if (t[dl][l] != 0) { return t[dl][l]; } if (l >= m) { t[dl][l] = 0; return 0; } // cout << "t[" << dl << "]["<< l << "]" << endl; if (m - 2 - l > 0) { for (int i = 0; i <= dl - 2; i++) { long long fs = f(dl - i - 2, l + 1); if (fs == 0) { break; } if (i < dl - 2) { fs *= (m - 2 - l); fs %= MOD; } t[dl][l] += (powmod(m - 1 - l, i) * fs) % MOD; // cout << " (m - 2 - l) " << m - 2 - l << " dla i " << i << " " << pow(m - 1 - l, i) << " * " << fs << " = " << (powmod(m - 1 - l, i) * fs) % MOD << endl; t[dl][l] %= MOD; } t[dl][l] *= m - 2 - l; t[dl][l] %= MOD; } if (dl > 1) { t[dl][l] += pow(m - 1 - l, dl - 1) - 1; t[dl][l] %= MOD; // cout << " (+ " << pow(m - 1 - l, dl - 1) - 1 << ") czyli do końca są 1" << endl; } // cout << " " << t[dl][l] << " + " << dl << " + " << pow(m - l - 1, dl) << endl; t[dl][l] += dl; t[dl][l] %= MOD; t[dl][l] += pow(m - l - 1, dl); t[dl][l] %= MOD; // cout << " t[" << dl << "]["<< l << "] = " << t[dl][l] << endl; return t[dl][l]; } int main() { ios_base::sync_with_stdio(0); cin >> n >> m; if (m == 1) { cout << 1 << endl; return 0; } if (n == 1) { cout << 0 << endl; return 0; } long long mn = m; for (int i = 1; i < n; i++) { t[0][i] = 1; mn *= m; mn %= MOD; } res = f(n - 2, 0) * m; res %= MOD; res *= m - 1; res %= MOD; // cout << mn << " - (" << f(n - 2, 0) << " * " << m << " * " << m - 1 << ")" << endl; res = mn - res; if (res < 0) { res += MOD; } cout << res << endl; return 0; } |
English