// template version 1.12
using namespace std;
#include <iostream>
#include <bits/stdc++.h>

// varibable settings
#define infile "../test/sample-1.in"
#define int long long //{{{
const int INF=1e18;
//}}}

// define basic macro {{{
#define _overload3(_1,_2,_3,name,...) name
#define _rep(i,n) repi(i,0,n)
#define repi(i,a,b) for(int i=(int)(a);i<(int)(b);++i)
#define rep(...) _overload3(__VA_ARGS__,repi,_rep,)(__VA_ARGS__)
#define _rrep(i,n) rrepi(i,0,n)
#define rrepi(i,a,b) for(int i=(int)((b)-1);i>=(int)(a);--i)
#define rrep(...) _overload3(__VA_ARGS__,rrepi,_rrep,)(__VA_ARGS__)
#define each(i,a) for (auto&& i : a)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define ceil(a,b) ((a)+(b)-1)/(b)
#define uni(x) sort(all(x));x.erase(unique(all(x)),x.end())
#define ub upper_bound
#define lb lower_bound
#define posl(A, x) (lower_bound(all(A), x)-A.begin())
#define posu(A, x) (upper_bound(all(A),x)-A.begin())
template<class T> inline void chmax(T &a, const T &b) { if((a) < (b)) (a) = (b); }
template<class T> inline void chmin(T &a, const T &b) { if((a) > (b)) (a) = (b); }

typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef long double ld;
typedef pair<int,int> pii;
typedef tuple<int,int,int> iii;

template<typename T> using PQ = priority_queue<T, vector<T>, greater<T>>;
struct Fast { Fast(){ std::cin.tie(0); ios::sync_with_stdio(false); } } fast;

#if defined(PCM) || defined(LOCAL)
  #include "lib/dump.hpp"
#else
  #define dump(...) 42
  #define dump_1d(...) 42
  #define dump_2d(...) 42
#endif
//}}}

const int mod=998244353;
struct mint { //{{{
  int x;
  mint(int x=0):x((x%mod+mod)%mod){}

  // ?= operator
  mint& operator+=(const mint a) { (x += a.x) %= mod; return *this; }
  mint& operator-=(const mint a) { (x += mod-a.x) %= mod; return *this; }
  mint& operator*=(const mint a) { (x *= a.x) %= mod; return *this; }
  mint&operator/=(const mint&rhs){return *this*=rhs.inv();}

  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 operator/(const mint&rhs)const{return mint(*this)/=rhs;}

  mint pow(int n)const{
    mint res(1),x(*this);
    while(n){
      if(n&1)res*=x;
      x*=x;
      n>>=1;
    }
    return res;
  }
  mint inv()const{return pow(mod-2);}
  /*mint inv()const{
    int x,y;
    int g=extgcd(v,mod,x,y);
    assert(g==1);
    if(x<0)x+=mod;
    return mint(x);
    }*/
  friend ostream& operator<<(ostream&os,const mint&m){
    return os<<m.x;
  }
  bool operator<(const mint&r)const{return x<r.x;}
  bool operator==(const mint&r)const{return x==r.x;}
};
//}}}

int n,x;
int p;

string to_bin(int n, int d){/*{{{*/
  // nをd桁の2進数で表示する。
  stringstream ss;
  ss << bitset<20>(n);
  return ss.str().substr(20-d, d);
}

int f(int y){
  if (y%2==0){
    y /= 2;
    y += p;
    return y;
  }
  else{
    return (y-1)/2;
  }
}

int g(int y){
  set<int> st;
  st.insert(y);
  int z = y;
  int cnt = 1;
  while (true){
    // dump(to_bin(z, 6));
    z = f(z);
    if (st.find(z)!=st.end()){
      if (z==y){
        // dump(to_bin(z, 6));
        return cnt;
      }
      else return 0;
    }
    st.insert(z);
    cnt++;
  }
}/*}}}*/

vi divisor(int n){  // 約数全列挙{{{
  vi p,q;
  for(int i=1; i*i<=n; i++){
    if (n%i==0){
      p.pb(i);
      if (i*i!=n) q.pb(n/i);
    }
  }
  reverse(all(q));
  p.insert(p.end(), all(q));
  return p;
}//}}}

mint stomint(string s){
  mint x = 0;
  rep(i, n){
    x *= 2;
    if (s[i]=='1') x += 1;
  }
  return x;
}

int solve(){
  cin>>n;
  string s;cin>>s;
  mint x = stomint(s);
  dump(x);
  vi D = divisor(n);

  mint ans = (x+1)*(2*n);
  dump(ans);

  vi vD;/*{{{*/
  set<int> Ds;
  each(d, D){
    int p = n/d;
    if (p%2==1 && 3*d<=n) {
      vD.pb(d);
      Ds.insert(d);
    }
  }
  dump(vD);
  /*}}}*/

  map<int, mint> dcnt;
  each(d, vD){
    int c = n/d;
    vector<vector<mint>> dp(c+1, vector<mint>(d+1));
    dp[0][0] = 1;
    rep(i, 1, d+1){
      rep(less, 2){  //未満確定フラグ
        int lim = less?1:s[i-1]-'0';
        rep(g, lim+1){
          dp[less || g<lim][i] += dp[less][i-1];
        }
      }
    }

    dump(dp[0]);
    dump(dp[1]);
    mint cnt = dp[0][d]+dp[1][d];
    dump("original", cnt);

    // 未満不確定はcheck

    string p = s.substr(0, d);
    string rp;
    rep(i, d){
      rp += (s[i]=='1'?'0':'1');
    }

    int sign = 0;
    for(int cur=0; cur<n; cur+=d){
      string q = s.substr(cur, d);
      dump(cur,p,q,sign, p>q);
      if (!sign and p>q){
        cnt -= 1;
        break;
      }
      else if (!sign and p<q){
        break;
      }

      if (sign and rp>q){
        cnt -= 1;
        break;
      }
      else if (sign and rp<q){
        break;
      }

      sign ^= 1;
    }

    each(d2, vD){
      if (d%d2==0 && (d/d2)%2==1) cnt -= dcnt[d2];
    }
    ans -= cnt*(2*n-2*d);
    dump(d, cnt, ans);
    dcnt[d] = cnt;
  }
  cout << ans << endl;

  return 0;
}

signed main() { //{{{
#ifdef INPUT_FROM_FILE
  std::ifstream in(infile);
  std::cin.rdbuf(in.rdbuf());
#endif
  solve();
  return 0;
} //}}}


Measured memory_bytes: 11344