Problem:
４つの整数の和 II

4,000 以下の正の整数 n を入力し、0 〜 1000 の範囲の整数 a, b, c, d の組で

a + b + c + d = n

を満たすものの組み合わせ数を出力するプログラムを作成して下さい。

Input

複数のデータセットが与えられます。各データセットに n が１行に与えられます。入力の最後まで処理して下さい。

データセットの数は 50 を超えません。

Output

各データセットごとに、a, b, c, d の組み合わせの個数を１行に出力して下さい。

Sample Input

2
3
35

Output for the Sample Input

10
20
8436

Solution in C++ (judge verdict: Accepted)

#include <cstdio>
#include <cstring>

using namespace std;

int dp[5][4444];

int solve(int a,int b)
{
  if(a*1000<b)return 0;
  if(a==0 && b==0)return dp[a][b]=1;
  if(dp[a][b]>=0)return dp[a][b];
  int res = 0;
  for(int i = 0; i <= 1000; i++) {
    if(b<i)break;
    res += solve(a-1,b-i);
  }
  return dp[a][b] = res;
}

int main(void)
{
  int n;
  memset(dp,-1,sizeof(dp));
  for(int i = 0; i <= 4000; i++) {
    solve(4,i);
  }
  while(scanf("%d",&n) == 1) {
    printf("%d\n",dp[4][n]);
  }
}