#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 1e2 + 5;
const int S = 1e2 + 5;
const int LEN = 1e2 + 5;
const int MOD = 998244353;
void add(int& a, int b) {
a += b;
if (a >= MOD) a -= MOD;
}
// Ở bài này ta sẽ for để cố định trước len = Số phần tử sẽ được chọn rồi sau đó mới đi tính dp với mỗi len
int n;
int a[N];
int dp[N][LEN][S]; // dp[i][j][sum_mod] = Số tập con có j phần tử khi xét đến vị trí i
// và có tổng mod len = sum_mod
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
int ans = 0;
for (int len = 1; len <= n; len++) {
memset(dp, 0, sizeof dp);
dp[0][0][0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= len; j++) {
for (int pre_sum_mod = 0; pre_sum_mod < len; pre_sum_mod++) {
// Không chọn a[i]
add(dp[i][j][pre_sum_mod], dp[i - 1][j][pre_sum_mod]);
// Chọn a[i]
if (j > 0) add(dp[i][j][(pre_sum_mod + a[i]) % len], dp[i - 1][j - 1][pre_sum_mod]);
}
}
}
add(ans, dp[n][len][0]);
} // O(n^4)
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgpjb25zdCBpbnQgSU5GID0gMWU5OyAgCmNvbnN0IGxsIExJTkYgPSAxZTE4OyAgCgpjb25zdCBpbnQgTiA9IDFlMiArIDU7IApjb25zdCBpbnQgUyA9IDFlMiArIDU7ICAKY29uc3QgaW50IExFTiA9IDFlMiArIDU7IApjb25zdCBpbnQgTU9EID0gOTk4MjQ0MzUzOyAgCgp2b2lkIGFkZChpbnQmIGEsIGludCBiKSB7CglhICs9IGI7IAoJaWYgKGEgPj0gTU9EKSBhIC09IE1PRDsKfQoKLy8g4bueIGLDoGkgbsOgeSB0YSBz4bq9IGZvciDEkeG7gyBj4buRIMSR4buLbmggdHLGsOG7m2MgbGVuID0gU+G7kSBwaOG6p24gdOG7rSBz4bq9IMSRxrDhu6NjIGNo4buNbiBy4buTaSBzYXUgxJHDsyBt4bubaSDEkWkgdMOtbmggZHAgduG7m2kgbeG7l2kgbGVuCmludCBuOyAgCmludCBhW05dOyAgCmludCBkcFtOXVtMRU5dW1NdOyAvLyBkcFtpXVtqXVtzdW1fbW9kXSA9IFPhu5EgdOG6rXAgY29uIGPDsyBqIHBo4bqnbiB04butIGtoaSB4w6l0IMSR4bq/biB24buLIHRyw60gaQoJCQkJICAgLy8gICAgICAgICAgICAgICAgICAgICB2w6AgY8OzIHThu5VuZyBtb2QgbGVuID0gc3VtX21vZCAKCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7CQoJY2luID4+IG47ICAKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY2luID4+IGFbaV07ICAgCgkJCglpbnQgYW5zID0gMDsgIAoJZm9yIChpbnQgbGVuID0gMTsgbGVuIDw9IG47IGxlbisrKSB7CgkJbWVtc2V0KGRwLCAwLCBzaXplb2YgZHApOyAgCgkJZHBbMF1bMF1bMF0gPSAxOyAgIAoKCQlmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKCQkJZm9yIChpbnQgaiA9IDA7IGogPD0gbGVuOyBqKyspIHsKCQkJCWZvciAoaW50IHByZV9zdW1fbW9kID0gMDsgcHJlX3N1bV9tb2QgPCBsZW47IHByZV9zdW1fbW9kKyspIHsKCQkJCQkvLyBLaMO0bmcgY2jhu41uIGFbaV0gCgkJCQkJYWRkKGRwW2ldW2pdW3ByZV9zdW1fbW9kXSwgZHBbaSAtIDFdW2pdW3ByZV9zdW1fbW9kXSk7ICAKCQkJCQkvLyBDaOG7jW4gYVtpXQoJCQkJCWlmIChqID4gMCkgYWRkKGRwW2ldW2pdWyhwcmVfc3VtX21vZCArIGFbaV0pICUgbGVuXSwgZHBbaSAtIDFdW2ogLSAxXVtwcmVfc3VtX21vZF0pOyAKCQkJCX0KCQkJfQoJCX0KCgkJYWRkKGFucywgZHBbbl1bbGVuXVswXSk7IAoJfSAvLyBPKG5eNCkKCgljb3V0IDw8IGFucyA8PCAnXG4nOyAKfQ==