// Original C++ solution (slower):
#include <bits/stdc++.h>

using namespace std;

typedef long long   signed int LL;

typedef long long unsigned int LU;

#define incID(i, l, r) for(LL i = (l)    ; i <  (r); ++i)

#define incII(i, l, r) for(LL i = (l)    ; i <= (r); ++i)

#define decID(i, l, r) for(LL i = (r) - 1; i >= (l); --i)

#define decII(i, l, r) for(LL i = (r)    ; i >= (l); --i)

#define inc(i, n)  incID(i, 0, n)

#define inc1(i, n) incII(i, 1, n)

#define dec(i, n)  decID(i, 0, n)

#define dec1(i, n) decII(i, 1, n)

#define inID(v, l, r) ((l) <= (v) && (v) <  (r))

#define inII(v, l, r) ((l) <= (v) && (v) <= (r))

#define PB push_back

#define EB emplace_back

#define MP make_pair

#define FI first

#define SE second

#define  ALL(v)  v.begin(),  v.end()

#define RALL(v) v.rbegin(), v.rend()

template<typename T> bool setmin  (T & a, T b) { if(b <  a) { a = b; return true; } else { return false; } }

template<typename T> bool setmax  (T & a, T b) { if(b >  a) { a = b; return true; } else { return false; } }

template<typename T> bool setmineq(T & a, T b) { if(b <= a) { a = b; return true; } else { return false; } }

template<typename T> bool setmaxeq(T & a, T b) { if(b >= a) { a = b; return true; } else { return false; } }

LL mo(LL a, LL b) { assert(b > 0); a %= b; if(a < 0) { a += b; } return a; }

LL fl(LL a, LL b) { assert(b > 0); return (a > 0 ? a / b : (a - b + 1) / b); }

LL ce(LL a, LL b) { assert(b > 0); return (a < 0 ? a / b : (a + b - 1) / b); }

template<typename T> T gcd(T a, T b) { return (b == 0 ? a : gcd(b, a % b)); }

template<typename T> T lcm(T a, T b) { return a / gcd(a, b) * b; }

#define bit(b, i) (((b) >> (i)) & 1)

#define BC __builtin_popcountll

#define SC static_cast

#define SI(v) SC<int>(v.size())

#define SL(v) SC<LL >(v.size())

#define RF(e, v) for(auto & e: v)

#define ef else if

#define UR assert(false)



// ---- ----



template<LL M> class ModInt {

private:

	LL v = 0;

public:

	ModInt() { }

	ModInt(LL vv) { setval(vv); }

	ModInt & setval(LL vv) { v = vv % M; if(v < 0) { v += M; } return (*this); }

	LL getval() const { return v; }

	ModInt & operator+=(const ModInt & b)       { return setval(v + b.v); }

	ModInt & operator-=(const ModInt & b)       { return setval(v - b.v); }

	ModInt & operator*=(const ModInt & b)       { return setval(v * b.v); }

	ModInt & operator/=(const ModInt & b)       { return setval(v * b.inv()); }

	ModInt & operator^=(            LU b)       { return setval(ex(v, b)); }

	ModInt   operator+ (                ) const { return ModInt(+v); }

	ModInt   operator- (                ) const { return ModInt(-v); }

	ModInt   operator+ (const ModInt & b) const { return ModInt(v + b.v); }

	ModInt   operator- (const ModInt & b) const { return ModInt(v - b.v); }

	ModInt   operator* (const ModInt & b) const { return ModInt(v * b.v); }

	ModInt   operator/ (const ModInt & b) const { return ModInt(v * b.inv()); }

	ModInt   operator^ (            LU b) const { return ModInt(ex(v, b)); }

	LL inv() const {

		LL x = (ex_gcd(v, M).FI + M) % M;

		assert(v * x % M == 1);

		return x;

	}

	LL ex(LL a, LU b) const {

		LL D = 64, x[64], y = 1;

		inc(i, D) { if((b >> i) == 0) { D = i; break; } }

		inc(i, D) { x[i] = (i == 0 ? a : x[i - 1] * x[i - 1]) % M; }

		inc(i, D) { if((b >> i) & 1) { (y *= x[i]) %= M; } }

		return y;

	}

	pair<LL, LL> ex_gcd(LL a, LL b) const {

		if(b == 0) { return MP(1, 0); }

		auto p = ex_gcd(b, a % b);

		return MP(p.SE, p.FI - (a / b) * p.SE);

	}

};

template<LL M> ModInt<M> operator+(LL a, const ModInt<M> & b) { return  b + a; }

template<LL M> ModInt<M> operator-(LL a, const ModInt<M> & b) { return -b + a; }

template<LL M> ModInt<M> operator*(LL a, const ModInt<M> & b) { return  b * a; }

template<LL M> ModInt<M> operator/(LL a, const ModInt<M> & b) { return  a * b.inv(); }

template<LL M> istream & operator>>(istream & is, ModInt<M> & b) { LL v; is >> v; b.setval(v); return is; }

template<LL M> ostream & operator<<(ostream & os, const ModInt<M> & b) { return (os << b.getval()); }



// ---- ----



vector<pair<LL, LL>> prime_factorization(LL x) {

	assert(x > 0);

	vector<pair<LL, LL>> f;

	for(LL i = 2; i <= x; i++) {

		if(i * i > x) { i = x; }

		if(x % i == 0) {

			f.EB(i, 0);

			while(x % i == 0) { f.back().SE++; x /= i; }

		}

	}

	return f;

}



vector<LL> divisors(LL x) {

	auto pf = prime_factorization(x);

	vector<LL> d = { 1 };

	for(auto e: pf) {

		int ds = d.size();

		inc(i, ds) {

			LL v = d[i];

			inc(j, e.SE) { v *= e.FI; d.PB(v); }

		}

	}

	sort(ALL(d));

	return d;

}



typedef ModInt<998244353> MI;



int n;

string x;

vector<LL> di;



MI mu[200001];

void mumu(LL x) {

	auto pf = prime_factorization(x);

	RF(e, pf) { if(e.SE > 1) { return; } }

	mu[x] = (SI(pf) % 2 == 0 ? +1 : -1);

}



MI f[200001];

void ff(int d) {

	if(n % d != 0) { return; }

	int B = n / d;

	if(B % 2 == 0) { return; }

	

	MI ans = 0;

	inc(i, d) {

		ans *= 2;

		ans += (x[i] - '0');

	}

	

	string s = x.substr(0, d);

	string t = s;

	inc(i, d) { t[i] = (t[i] == '0' ? '1' : '0'); }

	

	string u = s;

	inc(i, (B - 1) / 2) { u += t + s; }

	assert(SI(x) == SI(u));

	if(u <= x) { ans += 1; }

	

	f[d] = ans;

}



MI g(int d) {

	if(n % d != 0) { return 0; }

	int B = n / d;

	if(B % 2 == 0) { return 0; }

	

	MI ans = 0;

	RF(e, di) {

		if(d % e == 0) { ans += mu[d / e] * f[e]; }

	}

	return ans;

}



int main() {

	cin >> n >> x;

	

	di = divisors(n);

	inc1(d, n) { ff(d); }

	inc1(d, n) { mumu(d); }

	

	MI ans = 0;

	inc1(d, n) { ans += 2 * d * g(d); }

	

	cout << ans << endl;

	

	return 0;

}


// Optimized solution to the same problem (faster):
#include <bits/stdc++.h>

using namespace std;

typedef long long   signed int LL;

typedef long long unsigned int LU;

#define incID(i, l, r) for(LL i = (l)    ; i <  (r); ++i)

#define incII(i, l, r) for(LL i = (l)    ; i <= (r); ++i)

#define decID(i, l, r) for(LL i = (r) - 1; i >= (l); --i)

#define decII(i, l, r) for(LL i = (r)    ; i >= (l); --i)

#define inc(i, n)  incID(i, 0, n)

#define inc1(i, n) incII(i, 1, n)

#define dec(i, n)  decID(i, 0, n)

#define dec1(i, n) decII(i, 1, n)

#define inID(v, l, r) ((l) <= (v) && (v) <  (r))

#define inII(v, l, r) ((l) <= (v) && (v) <= (r))

#define PB push_back

#define EB emplace_back

#define MP make_pair

#define FI first

#define SE second

#define  ALL(v)  v.begin(),  v.end()

#define RALL(v) v.rbegin(), v.rend()

template<typename T> bool setmin  (T & a, T b) { if(b <  a) { a = b; return true; } else { return false; } }

template<typename T> bool setmax  (T & a, T b) { if(b >  a) { a = b; return true; } else { return false; } }

template<typename T> bool setmineq(T & a, T b) { if(b <= a) { a = b; return true; } else { return false; } }

template<typename T> bool setmaxeq(T & a, T b) { if(b >= a) { a = b; return true; } else { return false; } }

LL mo(LL a, LL b) { assert(b > 0); a %= b; if(a < 0) { a += b; } return a; }

LL fl(LL a, LL b) { assert(b > 0); return (a > 0 ? a / b : (a - b + 1) / b); }

LL ce(LL a, LL b) { assert(b > 0); return (a < 0 ? a / b : (a + b - 1) / b); }

template<typename T> T gcd(T a, T b) { return (b == 0 ? a : gcd(b, a % b)); }

template<typename T> T lcm(T a, T b) { return a / gcd(a, b) * b; }

#define bit(b, i) (((b) >> (i)) & 1)

#define BC __builtin_popcountll

#define SC static_cast

#define SI(v) SC<int>(v.size())

#define SL(v) SC<LL >(v.size())

#define RF(e, v) for(auto & e: v)

#define ef else if

#define UR assert(false)



// ---- ----



template<LL M> class ModInt {

private:

	LL v = 0;

public:

	ModInt() { }

	ModInt(LL vv) { setval(vv); }

	ModInt & setval(LL vv) { v = vv % M; if(v < 0) { v += M; } return (*this); }

	LL getval() const { return v; }

	ModInt & operator+=(const ModInt & b)       { return setval(v + b.v); }

	ModInt & operator-=(const ModInt & b)       { return setval(v - b.v); }

	ModInt & operator*=(const ModInt & b)       { return setval(v * b.v); }

	ModInt & operator/=(const ModInt & b)       { return setval(v * b.inv()); }

	ModInt & operator^=(            LU b)       { return setval(ex(v, b)); }

	ModInt   operator+ (                ) const { return ModInt(+v); }

	ModInt   operator- (                ) const { return ModInt(-v); }

	ModInt   operator+ (const ModInt & b) const { return ModInt(v + b.v); }

	ModInt   operator- (const ModInt & b) const { return ModInt(v - b.v); }

	ModInt   operator* (const ModInt & b) const { return ModInt(v * b.v); }

	ModInt   operator/ (const ModInt & b) const { return ModInt(v * b.inv()); }

	ModInt   operator^ (            LU b) const { return ModInt(ex(v, b)); }

	LL inv() const {

		LL x = (ex_gcd(v, M).FI + M) % M;

		assert(v * x % M == 1);

		return x;

	}

	LL ex(LL a, LU b) const {

		LL D = 64, x[64], y = 1;

		inc(i, D) { if((b >> i) == 0) { D = i; break; } }

		inc(i, D) { x[i] = (i == 0 ? a : x[i - 1] * x[i - 1]) % M; }

		inc(i, D) { if((b >> i) & 1) { (y *= x[i]) %= M; } }

		return y;

	}

	pair<LL, LL> ex_gcd(LL a, LL b) const {

		if(b == 0) { return MP(1, 0); }

		auto p = ex_gcd(b, a % b);

		return MP(p.SE, p.FI - (a / b) * p.SE);

	}

};

template<LL M> ModInt<M> operator+(LL a, const ModInt<M> & b) { return  b + a; }

template<LL M> ModInt<M> operator-(LL a, const ModInt<M> & b) { return -b + a; }

template<LL M> ModInt<M> operator*(LL a, const ModInt<M> & b) { return  b * a; }

template<LL M> ModInt<M> operator/(LL a, const ModInt<M> & b) { return  a * b.inv(); }

template<LL M> istream & operator>>(istream & is, ModInt<M> & b) { LL v; is >> v; b.setval(v); return is; }

template<LL M> ostream & operator<<(ostream & os, const ModInt<M> & b) { return (os << b.getval()); }



// ---- ----



typedef ModInt<998244353> MI;



int main() {

	int n;

	string x;

	cin >> n >> x;

	

	vector<MI> dp(n + 1);

	inc1(i, n) {

		if(! (n % i == 0 && n / i % 2 != 0)) { continue; }

		

		string s = x.substr(0, i);

		MI v = 0;

		RF(e, s) { v = 2 * v + (e - '0'); }

		dp[i] = v;

		

		string t = s;

		RF(e, t) { e = (e == '0' ? '1' : '0'); }

		string u = s;

		inc(j, (n / i - 1) / 2) { u += t + s; }

		if(u <= x) { dp[i] += 1; }

	}

	

	MI ans = 0;

	inc1(i, n) {

		if(! (n % i == 0 && n / i % 2 != 0)) { continue; }

		

		ans += 2 * i * dp[i];

		for(int j = 2 * i; j <= n; j += i) { dp[j] -= dp[i]; }

	}

	

	cout << ans << endl;

	

	return 0;

}


// Fastest known solution for this problem: