Problem:
D : Hopping Hearts / こころぴょんぴょん

問題文

N 羽のうさぎが長さ L−1 の平均台の上にいる。 i 番目のうさぎの初期位置は整数 x_iであり、 0 ≤ x_{i} \lt x_{i+1} ≤ L−1 を満たす。座標は右に進むほど大きくなる。任意の i 番目のうさぎは、任意の回数だけ、ちょうど距離 a_i だけ右方向にジャンプ(すなわち、x_i から x_i+a_i へ移動)することができる。ただし別のうさぎを飛び越えること、−1 以下または L 以上の位置に入ることはできない。また、同時にジャンプしていられるのは高々 1 羽であり、ある座標に存在できるうさぎの数も高々 1 羽である。

初期状態から始めてジャンプを任意の回数繰り返したあとの x_{0}, …, x_{N−1} の状態として、あり得るものは何通りあるか。1\,000\,000\,007 で割った余りで求めよ。

入力

入力は以下の形式で与えられる。

N L
x_{0} … x_{N−1}
a_{0} … a_{N−1}

制約

入力はすべて整数である

1 \≤ N \≤ 5\,000

N \≤ L \≤ 5\,000

0 \≤ x_{i} \lt x_{i+1} \≤ L−1

0 \≤ a_{i} \≤ L−1

出力

答えを1行で出力せよ。

サンプル

サンプル入力1

1 3
0
1

サンプル出力1

3

1/0でうさぎがいる/いないを表現すれば、100, 010, 001 の 3 通りである。

サンプル入力2

2 4
0 1
1 2

サンプル出力2

4

1100, 1001, 0101, 0011 の 4 通りである。

サンプル入力3

10 50
0 1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1 1

サンプル出力3

272278100

二項係数 C(50,10) = 10\,272\,278\,170 であり、それを 1\,000\,000\,007 で割ったあまりは 272\,278\,100 である。

Solution in C (judge verdict: Wrong Answer)

// AOJ 2665: Hopping Hearts
// 2018.1.3 bal4u@uu


#include <stdio.h>
#include <string.h>

#define M  1000000007

int x[5002], a[5002];
int dp[2][5002];

//#define getchar_unlocked()  getchar()
int in()
{
	int n = 0;
	int c = getchar_unlocked();
	do n = (n<<3)+(n<<1) + (c & 0xf), c = getchar_unlocked();
	while (c >= '0');
	return n;
}

 
int main()
{
    int n, L, i, j, k1, k2;

	n = in(), L = in();
    for (i = 0; i < n; i++) x[i] = in();
    for (i = 0; i < n; i++) a[i] = in();
  
	for (i = 0; i < L; i++) dp[0][i] = 1;
    for (k1 = 0, k2 = 1, i = 0; i < n; i++, k1 = k2, k2 = !k2) {
		memset(dp[k2], 0, sizeof(dp[0]));
		if (!a[i]) dp[k2][x[i]] = dp[k1][x[i]];
		else for (j = x[i]; j < L; j += a[i]) {
			if (!j) dp[k2][j] = dp[k1][j];
			else {
				dp[k2][j] += dp[k1][j-1];
				if (dp[k2][j] >= M) dp[k2][j] -= M;
			}
		}
          
		for (j = x[i]; j < L; j++) {
			dp[k2][j+1] += dp[k2][j];
			if (dp[k2][j+1] >= M) dp[k2][j+1] -= M;
		}
    }
    printf("%d\n", dp[k1][L-1]);
    return 0;
}