#include <iostream>
#include <memory>
#include <vector>
class Solution
{
std::vector<std::vector<int>> memo;
int M = 1000000007;
int inv(int n, int k)
{
if (n == 0)
return 0;
if (k == 0)
return 1;
if (memo[n][k] != -1)
return memo[n][k];
int val = (inv(n - 1, k) + M - ((k - n) >= 0 ? inv(n - 1, k - n) : 0)) % M;
memo[n][k] = (inv(n, k - 1) + val) % M;
return memo[n][k];
}
public:
Solution(int nmax, int kmax)
: memo(nmax, std::vector<int>(kmax,-1))
{
}
int kInversePairs(int n, int k)
{
return ((inv(n, k) + M - (k > 0 ? inv(n, k - 1) : 0)) % M);
}
};
int main()
{
Solution sol(1001, 1001);
std::cout << sol.kInversePairs(1000, 999) << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgoKY2xhc3MgU29sdXRpb24KewogICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50Pj4gbWVtbzsKICAgIGludCBNID0gMTAwMDAwMDAwNzsKICAgIAogICAgaW50IGludihpbnQgbiwgaW50IGspCiAgICB7CiAgICAgICAgaWYgKG4gPT0gMCkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgCiAgICAgICAgaWYgKGsgPT0gMCkKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgCiAgICAgICAgaWYgKG1lbW9bbl1ba10gIT0gLTEpCiAgICAgICAgICAgIHJldHVybiBtZW1vW25dW2tdOwogICAgICAgIAogICAgICAgIGludCB2YWwgPSAoaW52KG4gLSAxLCBrKSArIE0gLSAoKGsgLSBuKSA+PSAwID8gaW52KG4gLSAxLCBrIC0gbikgOiAwKSkgJSBNOwogICAgICAgIG1lbW9bbl1ba10gPSAoaW52KG4sIGsgLSAxKSArIHZhbCkgJSBNOwogICAgICAgIHJldHVybiBtZW1vW25dW2tdOwogICAgfQogICAgCnB1YmxpYzoKICAgIFNvbHV0aW9uKGludCBubWF4LCBpbnQga21heCkKICAgICAgICA6IG1lbW8obm1heCwgc3RkOjp2ZWN0b3I8aW50PihrbWF4LC0xKSkKICAgIHsKICAgIH0KCiAgICBpbnQga0ludmVyc2VQYWlycyhpbnQgbiwgaW50IGspCiAgICB7CiAgICAgICAgcmV0dXJuICgoaW52KG4sIGspICsgTSAtIChrID4gMCA/IGludihuLCBrIC0gMSkgOiAwKSkgJSBNKTsKICAgIH0KfTsKCgppbnQgbWFpbigpCnsKICAgIFNvbHV0aW9uIHNvbCgxMDAxLCAxMDAxKTsKICAgIHN0ZDo6Y291dCA8PCBzb2wua0ludmVyc2VQYWlycygxMDAwLCA5OTkpIDw8ICdcbic7Cn0K