K Inverse Pairs Array

hard dp math

Problem

Count permutations of 1..n with exactly k inverse pairs (modulo 10^9+7).

Inputn=3 k=1
Output2
Permutations [1,3,2] and [2,1,3] each have 1 inversion.

def k_inverse_pairs(n, k):
    MOD = 10**9 + 7
    dp = [0] * (k + 1); dp[0] = 1
    for i in range(1, n + 1):
        nxt = [0] * (k + 1); pref = 0
        for j in range(k + 1):
            pref = (pref + dp[j]) % MOD
            if j >= i: pref = (pref - dp[j - i]) % MOD
            nxt[j] = pref
        dp = nxt
    return dp[k] % MOD
function kInversePairs(n, k) {
  const MOD = 1e9 + 7;
  let dp = new Array(k + 1).fill(0); dp[0] = 1;
  for (let i = 1; i <= n; i++) {
    const nxt = new Array(k + 1).fill(0); let pref = 0;
    for (let j = 0; j <= k; j++) {
      pref = (pref + dp[j]) % MOD;
      if (j >= i) pref = (pref - dp[j - i] + MOD) % MOD;
      nxt[j] = pref;
    }
    dp = nxt;
  }
  return Number(dp[k]);
}
int kInversePairs(int n, int k) {
    long MOD = 1_000_000_007L;
    long[] dp = new long[k + 1]; dp[0] = 1;
    for (int i = 1; i <= n; i++) {
        long[] nxt = new long[k + 1]; long pref = 0;
        for (int j = 0; j <= k; j++) {
            pref = (pref + dp[j]) % MOD;
            if (j >= i) pref = (pref - dp[j - i] + MOD) % MOD;
            nxt[j] = pref;
        }
        dp = nxt;
    }
    return (int) dp[k];
}
int kInversePairs(int n, int k) {
    const int MOD = 1e9 + 7;
    vector dp(k + 1, 0); dp[0] = 1;
    for (int i = 1; i <= n; i++) {
        vector nxt(k + 1, 0); long pref = 0;
        for (int j = 0; j <= k; j++) {
            pref = (pref + dp[j]) % MOD;
            if (j >= i) pref = (pref - dp[j - i] + MOD) % MOD;
            nxt[j] = pref;
        }
        dp = nxt;
    }
    return (int) dp[k];
}
Time: O(n·k) Space: O(k)