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>
using namespace std;
typedef long long ll;
#define all(x) (x).begin(),(x).end()
const int mod=998244353,MAX=205,INF=1<<29;

ll ruijou(ll a,ll b){
    ll ans=1;
    while(b>0){
        if(b&1) ans=ans*a%mod;
        a=a*a%mod;
        b/=2;
    }
    return ans;
}

int main(){
    
    int N;cin>>N;
    vector<int> dont;
    string X;cin>>X;
    for(int i=1;i<N;i++){
        if(N%i==0&&(N/i)%2==1) dont.push_back(i);
    }
    
    ll sum=1,rui=1;
    for(int i=0;i<N;i++){
        if(X[N-1-i]=='1') sum+=rui;
        //if(X[N-1-i]=='1') cout<<rui<<endl;
        rui=rui*2%mod;
        sum=sum%mod;
    }
    
    //cout<<sum<<endl;
    
    sum=sum*ll(2*N)%mod;
    
    for(int a:dont){
        
        sum+=(mod-2*N)*ruijou(2,a);
        sum%=mod;
        sum+=2*a*ruijou(2,a);
        sum%=mod;
        
        /*string A;
        for(int i=0;i<N/a;i++){
            if(i%2==0){
                for(int j=0;j<a;j++) A+='0';
            }else{
                for(int j=0;j<a;j++) A+='1';
            }
        }
        
        for(int i=0;i<2*a;i++){
            //cout<<a<<" "<<i<<" "<<A<<endl;
            if(A<=X){
                sum+=mod-2*N;
                sum+=2*a;
                sum%=mod;
            }
            if(A[N-1]=='0'){
                A='1'+A.substr(0,N-1);
            }else{
                A='0'+A.substr(0,N-1);
            }
        }*/
    }
    
    cout<<sum<<endl;
    
    
}