func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MOD(1000000007);   const int Max_W(1000050);   inline int Mult(const int &a, const int &b) { return (a * 1LL) * b % MOD; }   constexpr int Add(int a, int b) { return a + b >= MOD ? a + b - MOD : a + b; }   constexpr int Sub(int a, int b) { return a - b < 0 ? a - b + MOD : a - b; }   void exgcd(const int &a, const int &b, int &x, int &y) {     if (b == 0)       x = 1, y = 0;     else       exgcd(b, a % b, y, x), y -= x * (a / b);   }   inline int inverse(const int &a) {     int invx, invy;     exgcd(a, MOD, invx, invy);     return (invx % MOD + MOD) % MOD;   }   int power(int a, int n) {     int Ret(1);     while (n) {       if (n & 1) Ret = Mult(Ret, a);       a = Mult(a, a), n >>= 1;     }     return Ret;   }   int W, A[Max_W], Fac[Max_W], Inv[Max_W];   inline int P(const int &n, const int &m) {     return (0 <= m && m <= n) ? Mult(Fac[n], Inv[n - m]) : 0;   }   int work(const int &N) {     int Ans(0);     if (W == 1)       Ans = N;     else       Ans = Mult(Sub(power(W, N + 1), W), inverse(Sub(W, 1)));     for (int len = N + 1; len - N <= W; ++len)       if (len - N < N + 1)         Ans =             Add(Ans, Mult(Mult(A[len - N], A[len - N]), power(W, N - (len - N))));       else         Ans = Add(Ans, Mult(A[len - N], P(W - ((len - N) - (N + 1) + 1), N)));     return Ans;   }   int main() {     int N;     scanf( %d%d , &W, &N);     A[0] = 1;     for (int i = 1; i <= W; ++i) A[i] = Mult(A[i - 1], W - i + 1);     Fac[0] = 1;     for (int i = 1; i <= W; ++i) Fac[i] = Mult(Fac[i - 1], i);     Inv[W] = inverse(Fac[W]);     for (int i = W - 1; i >= 0; --i) Inv[i] = Mult(Inv[i + 1], i + 1);     printf( %d , Sub(work(N), work(N - 1)));     return 0;   }   