//g++ -std=c++14 test.cpp -o test.out
//問題URL
//https://atcoder.jp/contests/arc110/tasks/arc110_d

//参考：
//https://drken1215.hatenablog.com/entry/2020/12/06/070100
// ポイント：二項係数を扱う方法論として、経路数へと帰着する方法がある
// 積=かつ、和=行き先増やす
// 使った使わないを論じるといいかも
 
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <cassert>
#include <algorithm>
#include <functional>
#include <iostream>
#include <iomanip>
#include <vector>
#include <queue>
#include <stack>
#include <map> 
#include <unordered_map> 
#include <utility>
#include <limits.h>
#include <bitset>
#include <set>
using namespace std;
 
#define LL long long int
const LL INF = (1LL<<60);
const int INF_INT = 2147483647-1e6-1;
const LL mod = 1000000007ll;
const int mod_int = 1000000007;

//https://github.com/atcoder-live/library/blob/master/mint.cpp
struct mint {
  LL x; 
  mint(LL x=0):x((x%mod+mod)%mod){}
  mint& operator+=(const mint a) {
    if ((x += a.x) >= mod) x -= mod;
    return *this;
  }
  mint& operator-=(const mint a) {
    if ((x += mod-a.x) >= mod) x -= mod;
    return *this;
  }
  mint& operator*=(const mint a) {
    (x *= a.x) %= mod;
    return *this;
  }
  mint operator+(const mint a) const {
    mint res(*this);
    return res+=a;
  }
  mint operator-(const mint a) const {
    mint res(*this);
    return res-=a;
  }
  mint operator*(const mint a) const {
    mint res(*this);
    return res*=a;
  }
  mint pow(LL t) const {
    if (!t) return 1;
    mint a = pow(t>>1);
    a *= a;
    if (t&1) a *= *this;
    return a;
  }
 
  // for prime mod
  mint inv() const {
    return pow(mod-2);
  }
  mint& operator/=(const mint a) {
    return (*this) *= a.inv();
  }
  mint operator/(const mint a) const {
    mint res(*this);
    return res/=a;
  }
};
 
struct combination {
  vector<mint> fact, ifact;//factに階乗を計算、ifactはその各々に対する逆元
  combination(LL n):fact(n+1),ifact(n+1) {
    assert(n < mod);
    fact[0] = 1;
    for (LL i = 1; i <= n; ++i) fact[i] = fact[i-1]*i;
    ifact[n] = fact[n].inv();
    for (LL i = n; i >= 1; --i) ifact[i-1] = ifact[i]*i;
  }
  mint operator()(LL n,LL k) {
    if (k < 0 || k > n) return 0;
    return fact[n]*ifact[k]*ifact[n-k];
  }
};

LL N,M;
LL A[2000];

mint ans = 1;
 
void solve(){
    LL sum = 0;
    for(int i=0;i<N;i++) sum+=A[i];

    for(LL i=0;i<sum+N;i++){
        ans *= mint(M+N-i);
        ans /= mint(i+1LL);
    }
}

int main(){
    cin >> N >> M;
    for(int i=0;i<N;i++) cin >> A[i];
 
    solve();

    cout << ans.x << endl;
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = a; i < b; ++i)

int debug = 0;

const int N = 3e5, mod = 998244353;

int n, cnt = 0, clr = 1, ans, f[N], was[N];
vector <int> inv[N];

void dfs(int v) {
    if (was[v] == clr) return;
    was[v] = clr;
    dfs(f[v]);
    for (int i : inv[v]) dfs(i);
}

main() {
    cin >> n;
    rep(i, 1, n + 1) {
        cin >> f[i];
        inv[f[i]].push_back(i);
    }
    rep(i, 1, n + 1) {
        if (!was[i]) {
            ++cnt;
            dfs(i);
            clr++;
        }
    }
    ans = 1;
    rep(i, 0, cnt) {
        ans = ans + ans;
        while (ans >= mod) ans -= mod;
    }
    ans = (ans - 1 + mod) % mod;
    cout << ans << '\n';
}