//xビット目が1になる分割方法の数をO(N^2)のDPで数えられるのでO(N^3)でまず解ける。 //DPを累積和またはFenwick Treeで高速化すると、O(N^2)またはO(N^2logN)で解ける。 //添え字周り、かなりバグらせやすくて苦手。 #include #include #include #include #define rep(i, n) for(i = 0; i < n; i++) using namespace std; using namespace atcoder; using mint = modint998244353; int n; string s; mint pw2[4000]; mint solve(int x) { fenwick_tree fw(n + 1); fw.add(0, 1); for (int i = 1; i <= x; i++) { fw.add(i, fw.sum(0, i)); } for (int i = x + 1; i <= n; i++) { mint lsum = fw.sum(0, i - x); mint rsum = fw.sum(i - x, i); if (s[i - 1 - x] == '0') fw.add(i, lsum); fw.add(i, rsum); } mint res = fw.sum(n, n + 1); return pw2[n - 1] - res; } int main() { int i; cin >> n >> s; pw2[0] = 1; for (i = 1; i < n; i++) pw2[i] = pw2[i - 1] * 2; mint ans = 0; rep(i, n) { ans += solve(i) * pw2[i]; } cout << ans.val() << endl; return 0; }