public int waysToReachTarget(int target, int[][] types) {
int n = types.length;
int mod = 1_000_000_007;
int max = 0;
for (int i = 0; i < n; i++) {
max = Math.max(max, types[i][0]);
}
int[][] dp = new int[2][target + 1];
dp[0][0] = 1;
int mask = 1;
for (int i = 0; i < n; i++) {
int maxScore = types[i][0] * types[i][1];
for (int j = 0; j <= target && j <= maxScore; j += types[i][1]) {
for (int k = j; k <=target ; k++) {
dp[mask][k] = (dp[mask][k] + dp[mask ^ 1][k - j]) % mod;
}
}
mask ^= 1;
Arrays.fill(dp[mask], 0);
}
return dp[mask ^ 1][target];
}