#include #include using std::cin; using std::cout; const char endl = '\n'; const int N = 305, M = 1e5 + 5; const int mod = 1e9 + 7; int n, m, b[N], fa[N]; long long f[N][M]; std::vector g[N]; bool vis[N]; void dfs(int u) { std::fill_n(f[u] + 1, m + 1, 1); for (const int& v : g[u]) { dfs(v); for (int j = 1; j <= m + 1; j++) { f[u][j] = (f[u][j] * f[v][j - vis[v]]) % mod; } } if (u) { for (int i = 1; i <= m + 1; i++) { f[u][i] = (f[u][i] + f[u][i - 1]) % mod; } } } int main() { std::ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> b[i]; } for (int i = 1; i <= n; i++) { vis[i] = true; if (b[i] == -1) { fa[i] = 0; } else { fa[i] = b[i]; for (int j = b[i] + 1; j < i; j++) { if (fa[j] <= b[i]) { fa[j] = i; vis[j] = false; } } } } for (int i = 1; i <= n; i++) { g[fa[i]].emplace_back(i); } dfs(0); cout << f[0][m + 1] << endl; return 0; }