#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
using namespace std;
template <class T>
inline bool setmin(T &a, T b) {
  if (a > b) return a = b, 1;
  return 0;
}
template <class T>
inline bool setmax(T &a, T b) {
  if (a < b) return a = b, 1;
  return 0;
}
template <class T>
inline T fast(T a, T b, T mod) {
  long long res = 1;
  while (b) {
    if (b & 1) res = (res * a) % mod;
    a = (a * a) % mod;
    b >>= 1;
  }
  return res;
}
template <class T>
istream &operator>>(istream &os, vector<T> &container) {
  for (auto &u : container) os >> u;
  return os;
}
template <class T>
ostream &operator<<(ostream &os, const vector<T> &container) {
  for (auto &u : container) os << u << " ";
  return os;
}
template <class T>
inline T gcd(T a, T b) {
  while (b) swap(a %= b, b);
  return a;
}
const long long INF = 1e9 + 7;
const long long mod = 998244353;
const long long BIG_INF = 1e18 + 7;
const long long N = 1e6 + 7;
const long long T = 1 << 20;
const long double eps = 1e-12;
long long n, m, k, q;
vector<vector<int> > G(N);
string X;
string pom;
long long wynik_modulo(string a) {
  long long mnoz = 1;
  long long ret = 0;
  for (int i = (int)(a).size() - 1; i >= 0; i--) {
    if (a[i] == '1') ret = (ret + mnoz) % mod;
    mnoz = mnoz * 2 % mod;
  }
  return ret;
}
void odejmij() {
  while (pom.back() == '0') pom.pop_back();
  pom.pop_back();
  pom.push_back('0');
  while ((int)(pom).size() < n) pom.push_back('1');
}
bool same_jedynki(string second) {
  for (auto &u : second)
    if (u != '1') return false;
  return true;
}
string dodaj(string second) {
  if (same_jedynki(second)) {
    string ret;
    ret.push_back('1');
    for (int i = 0; i < (n); i++) ret.push_back('0');
    return ret;
  } else {
    while (second.back() == '1') second.pop_back();
    second.pop_back();
    second.push_back('1');
    while ((int)(second).size() < n) second.push_back('0');
    return second;
  }
  assert(false);
}
bool mniejszy(string second) {
  for (int i = 0; i <= n; i++) {
    if (second[i] == '1' and X[i] == '0') return false;
    if (second[i] == '0' and X[i] == '1') return true;
  }
  return true;
}
string zrob(string &cykl, int poz) {
  string ret;
  while ((int)(ret).size() < n) {
    ret.push_back(cykl[poz]);
    poz++;
    if (poz == (int)(cykl).size()) poz = 0;
  }
  return ret;
}
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> X;
  pom = X;
  long long ans = 0;
  for (int i = 1; i < n; i++) {
    if (n % i == 0 and (n / i) % 2 == 1) {
      string cykl;
      for (int j = 0; j < (i); j++) cykl.push_back('0');
      for (int j = 0; j < (i); j++) cykl.push_back('1');
      if (mniejszy(zrob(cykl, 0))) {
        if (mniejszy(zrob(cykl, i))) {
          for (int j = 0; j < (i * 2); j++) {
            odejmij();
            ans += i * 2;
          }
        } else if (!mniejszy(zrob(cykl, i - 1))) {
          int L = 0, P = i - 1;
          while (L - P > 1) {
            int mid = (L + P) / 2;
            (mniejszy(zrob(cykl, mid)) ? L : P) = mid;
          }
          for (int j = 0; j < (P); j++) {
            odejmij();
            ans += i * 2;
          }
        } else {
          if (!mniejszy(zrob(cykl, i * 2 - 1))) {
            for (int j = 0; j < (i); j++) {
              odejmij();
              ans += i * 2;
            }
          } else {
            int L = i, P = i * 2 - 1;
            while (L - P > 1) {
              int mid = (L + P) / 2;
              (mniejszy(zrob(cykl, mid)) ? P : L) = mid;
            }
            for (int j = 0; j < (i + (2 * i - P)); j++) {
              odejmij();
              ans += i * 2;
            }
          }
        }
      }
    }
  }
  cout << (ans + wynik_modulo(dodaj(pom)) * (n * 2) % mod) % mod << '\n';
}
