func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1100000;   const long long M = 1000000007;   long long i, j, k, l, m, n, o, p, K, w, F[N], ni[N];   inline long long fastmi(long long x, long long m) {     long long ans = 1;     while (m) {       if (m & 1) ans = (ans * x) % M;       x = (x * x) % M;       m >>= 1;     }     return ans;   }   inline long long get(long long l, long long r) {     long long ans;     if ((r < 0) || (l < 0)) return 0;     if (l > r) return 1;     if (l == 0) return 0;     ans = (F[r] * ni[l - 1]) % M;     return ans;   }   inline long long Solve() {     long long ans1, ans2, ans, cul, cant;     F[0] = 1;     ni[0] = 1;     for (i = 1; i <= K; i++) {       F[i] = (F[i - 1] * i) % M;       ni[i] = fastmi(F[i], M - 2);     }     ans = 0;     for (i = 0; i <= K - 1; i++) {       cant = i + 1 - w + 1;       if (cant < 0) cant = 0;       k = K - cant;       o = (get(K - i, K - 1) * min(w, i + 1)) % M;       l = w - i - 2;       if (l < 0) l = 0;       j = w - 1 - l;       p = (fastmi(k, l) * get(k - j + 1, k)) % M;       cul = (o * p) % M;       ans += cul;       if (ans >= M) ans -= M;     }     ans1 = ans;     ans = 0;     for (i = 0; i <= K - 1; i++) {       cant = i + 1 - (w - 1) + 1;       if (cant < 0) cant = 0;       k = K - cant;       o = (get(K - i, K - 1) * min(w - 1, i + 1)) % M;       l = w - 1 - i - 2;       if (l < 0) l = 0;       j = w - 1 - l;       p = (fastmi(k, l) * get(k - j + 1, k)) % M;       cul = (o * p) % M;       ans += cul;       if (ans >= M) ans -= M;     }     ans2 = ans1 - ans;     if (ans2 < 0) ans2 += M;     ans1 = ans1 + ans1;     if (ans1 >= M) ans1 -= M;     ans1 -= ans2;     if (ans1 < 0) ans1 += M;     ans = (ans1 * K) % M;     return ans;   }   int main() {     cin >> K >> w;     cout << Solve() << endl;     fclose(stdin);     fclose(stdout);     return 0;   }   