Problem:
Score : 800 points

Problem Statement

Given are integers N and X. For each integer k between 0 and X (inclusive), find the answer to the following question, then compute the sum of all those answers, modulo 998244353.

Let us repeat the following operation on the integer k. Operation: if the integer is currently odd, subtract 1 from it and divide it by 2; otherwise, divide it by 2 and add 2^{N-1} to it. How many operations need to be performed until k returns to its original value? (The answer is considered to be 0 if k never returns to its original value.)

Constraints

1 \leq N \leq 2\times 10^5

0 \leq X < 2^N

X is given in binary and has exactly N digits. (In case X has less than N digits, it is given with leading zeroes.)

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
X

Output

Print the sum of the answers to the questions for the integers between 0 and X (inclusive), modulo 998244353.

Sample Input 1

3
111

Sample Output 1

40

For example, for k=3, the operation changes k as follows: 1,0,4,6,7,3. Therefore the answer for k=3 is 6.

Sample Input 2

6
110101

Sample Output 2

616

Sample Input 3

30
001110011011011101010111011100

Sample Output 3

549320998

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 200000
#define X 998244353
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
using namespace std;
int n;int a[N+5],f[N+5],P[N+5];
I int GV(CI l,CI r,CI v=0) {RI i,t=0;for(i=l;i<=r;++i) t=(t<<1|(a[i]^v))%X;return t;}
I int Check(CI l1,CI r1,CI l2,CI r2,CI v=0)
{
	RI i=l1,j=l2;for(i=l1;i<=r1;++i,++j) if(a[i]^a[j]^v) return a[i]>(a[j]^v)?1:-1;
	return 0;
}
int main()
{
	RI i,j,p,t=0,cnt=0,x,y;string s;
	for(scanf("%d",&n),cin>>s,i=1;i<=n;++i) a[i]=s[i-1]&1;
	for(i=1;i^n;++i) if(!(n%i))
	{
		if((n/i)&1^1) continue;for(x=GV(1,i),j=i+1;j<=n;j+=2*i)
		{
			if((p=Check(1,i,j,j+i-1,1))) {p==-1&&--x;break;}
			if((p=Check(1,i,j+i,j+2*i-1))) {p==1&&--x;break;}
		}f[i]=x+1;
	}
	for(i=1;i<=n;++i) if(f[i])
	{
		for(j=2*i;j<=n;++j) f[j]&&Inc(f[j],X-f[i]);
		t=(2LL*i*f[i]+t)%X,Inc(cnt,f[i]);
	}return printf("%d",(2LL*n*(GV(1,n)-cnt+1+X)+t)%X),0;
}