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 JAVA (judge verdict: Time Limit Exceeded)

import java.util.*;
import java.math.*;
import java.awt.geom.*;
import java.io.*;
    
    
public class Main {
	static int INF = 2 << 27;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int l = sc.nextInt();
		int[] x = new int[n];
		int[] a = new int[n];
		for(int i = 0; i < n; i++) {
			x[i] = sc.nextInt();
		}
		for(int i = 0; i < n; i++) {
			a[i] = sc.nextInt();
		}
		int[] dp = new int[l+1];
		dp[l] = 1;
		for(int i = n; i > 0; i--) {
			for(int j = 0; j <= l; j++) {
				if(dp[j] == 0) continue; 
				if(a[i-1] == 0 && x[i-1] < j) {
					dp[x[i-1]] += dp[j];
					dp[x[i-1]] %= 1000000007;
				}
				else
				for(int k = 0; j > x[i-1] + a[i-1]*k; k++) {
					dp[x[i-1] + a[i-1] * k] += dp[j];
					dp[x[i-1] + a[i-1] * k] %= 1000000007;
				}
				dp[j] = 0;
			}
		}
		int sum = 0;
		for(int i = 0; i <= l; i++) {
			sum += dp[i];
			sum %= 1000000007;
		}
		
		System.out.println(sum);
		
		
		
		
	}
	
	
	
}