#include <bits/stdc++.h>
using namespace std;using ll=long long;using uint=unsigned int;using pii=pair<int,int>;using pll=pair<ll,ll>;using ull = unsigned long long;using ld=long double;template<typename T>void _(const char*s,T h){cerr<<s<<" = "<<h<<"\n";}template<typename T,typename...Ts>void _(const char*s,T h,Ts...t){int b=0;while(((b+=*s=='(')-=*s==')')!=0||*s!=',')cerr<<*s++;cerr<<" = "<<h<<",";_(s+1,t...);}// break continue pop_back 998244353
#define int ll
#define pii pll
#define f first
#define s second
#define pb emplace_back
#define forn(i,n) for(int i=0;i<(n);++i)
#define sqr(x) ((x)*(x))
struct init{init(){cin.tie(0);std::iostream::sync_with_stdio(0);cout<<std::fixed<<std::setprecision(10);cerr<<std::fixed<<std::setprecision(5);}~init(){
#ifdef LOCAL
#define dbg(...) _(#__VA_ARGS__,__VA_ARGS__)
cerr<<"Time elapsed: "<<(double)clock()/CLOCKS_PER_SEC<<"s.\n";
#else
#define dbg(...) 
#endif
}}init;template<typename T,typename U>void upx(T&x,U y){if(x<y)x=y;}template<typename T,typename U>void upn(T&x,U y){if(x>y)x=y;}
const int M=998244353;
const int N=2e5+5;
int p[N],u[N];
int res[N];
int ok(int n,int l){
    return n%l==0&&n%(l+l)==l;
}
int n;
int go(int i){
    if(i&1)return i/2;
    return i/2+(1<<n-1);
}
int32_t main(){
    string s;
    cin>>n>>s;
    reverse(s.begin(), s.end());
    while(s.size()<n)s+='0';
    reverse(s.begin(), s.end());
    p[0]=1;
    for(int i=1;i<=n;++i)p[i]=(p[i-1]*2)%M;
    int ans=0;
    for(int l=1;l<=n;++l){
        if(ok(n,l)){
            int le=0,gr=0;
            forn(i,n){
                char cu;
                if(i<l)cu=s[i];
                else{
                    int b=i/l;
                    if(b&1){
                        if(s[i%l]=='0')cu='1';
                        else cu='0';
                    }else{
                        cu=s[i%l];
                    }
                }
                // dbg(i,cu);
                if(cu<s[i])le=1;
                else if(cu>s[i])gr=1;
                if(le||gr)break;
            }
            string t=s.substr(0,l);
            int cur=1;
            dbg(l,le,gr,t);
            if(gr){
                int so=1;
                for(int i=l-1;i>=0;--i){
                    if(t[i]=='1'){
                        t[i]='0';
                        for(int j=i+1;j<l;++j)t[j]='1';
                        so=0;
                        break;
                    }
                }
                cur-=so;
            }
            forn(i,l)if(t[i]=='1')cur+=p[l-i-1];
            cur%=M;
            (res[l]+=cur)%=M;
            res[l]+=M;
            res[l]%=M;
            (ans+=res[l]*(l+l))%=M;
            dbg(l,cur,res[l]);
            for(int j=l+l;j<=n;j+=l){
                if(ok(n,j))res[j]-=res[l];
            }
        }
    }
    cout<<ans<<'\n';
    // int cnt=0,ans=0;
    // map<int,int> mp;
    // forn(i,1<<n){
    //     if(!u[i]){
    //         cnt++;
    //         int v=i,len=0;
    //         int cm=0;
    //         do{
    //             // cerr<<v<<"->";
    //             string t;
    //             int x=v;
    //             while(x){
    //                 if(x&1)t+='1';
    //                 else t+='0';
    //                 x/=2;
    //             }
    //             while(t.size()<n)t+='0';
    //             reverse(t.begin(), t.end());
    //             if(t<=s)cm++;
    //             u[v]=1;
    //             len++;
    //             v=go(v);
    //         }while(v!=i);
    //         // if(len!=2*n){
    //         //     len=0;
    //         //     do{
    //         //         // cerr<<v<<"->";
    //         //         u[v]=1;
    //         //         len++;
    //         //         v=go(v);
    //         //     }while(v!=i);
    //         //     // cerr<<'\n';
    //         //     dbg(len);
    //         // }
    //         mp[len]+=cm;
    //         ans+=len*cm;
    //     }
    // }
    // dbg(cnt,ans);
    // for(auto p:mp)dbg(p.f,p.s);

    return 0;
}


Measured memory_bytes: 3476