func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = int(1e6) + 50, P = int(1e9) + 7;   long long fac_NESC[N], rev[N], pow_NESC[N], revfac[N], w;   int k;   inline void inc(long long &x, long long y) { x = (x + y) % P; }   inline long long M(long long x, long long y) { return x * y % P; }   inline long long S(long long x) { return x * x % P; }   inline long long fpow(long long x, long long y) {     long long r(1);     for (; y; y >>= 1, x = M(x, x))       if (y & 1) r = M(r, x);     return r;   }   int main() {     ios::sync_with_stdio(false);     cin >> k >> w;     rev[1] = 1;     for (int i = 2; i <= k; ++i) rev[i] = ((-rev[P % i] * (P / i)) % P + P) % P;     fac_NESC[0] = 1;     for (int i = 1; i <= k; ++i) fac_NESC[i] = M(fac_NESC[i - 1], i);     pow_NESC[0] = fpow(k, w);     for (int i = 1; i <= k + 20; ++i) pow_NESC[i] = M(pow_NESC[i - 1], rev[k]);     revfac[0] = 1;     for (int i = 1; i <= k; ++i) revfac[i] = M(revfac[i - 1], rev[i]);     long long res(0);     for (int t = 1; t <= k; ++t) {       if (t <= w - 1)         inc(res, M(M(M(t, S(fac_NESC[k])), pow_NESC[t + 1]), S(revfac[k - t])));       if (t > w - 1)         inc(res,             M(M(M(fac_NESC[k], w), fac_NESC[k - t + w - 1]), S(revfac[k - t])));       if (t + 1 <= w - 1)         inc(res, M(M(M(t, S(fac_NESC[k])), pow_NESC[t + 2]),                    M(revfac[k - t], revfac[k - t - 1])));       if (t + 1 > w - 1)         inc(res, M(M(M(fac_NESC[k], w - 1), fac_NESC[k - t + w - 2]),                    M(revfac[k - t], revfac[k - t - 1])));     }     cout << res << endl;     return 0;   }   