#include<stdio.h>
#include<iostream>
#include<vector>
#include<math.h>
#include<queue>
#include<map>
#include<algorithm>
#include<string.h>
#include<functional>
#include<limits.h>
#include<stdlib.h>
#include<cmath>
#include<cstring>
#include<set>
#include<climits>
#include<deque>
#include<iomanip>
#include<utility>
using namespace std;

#define intmax INT_MAX
#define lmax LONG_MAX
#define uintmax UINT_MAX
#define ulmax ULONG_MAX
#define llmax LLONG_MAX
#define ll long long
#define rep(i,a,N) for((i)=(a);(i)<(N);(i)++)
#define rrp(i,N,a) for((i)=(N)-1;(i)>=(a);(i)--)
#define llfor ll i,j
#define sc(a) cin>>a
#define pr(a) cout<<a<<endl
#define pY puts("YES")
#define pN puts("NO")
#define py puts("Yes")
#define pn puts("No")
#define pnn printf("\n")
#define all(a) a.begin(),a.end()
#define push(a,b) (a).push_back(b)
#define llvec vector<vector<ll>>
#define charvec vector<vector<char>>
#define size(a,b) (a,vector<ll>(b))
#define llpvec vector<pair<ll,ll>>
#define S 21 
llfor;
const ll mod=1000000007;
/*pi*/const double pi=acos(-1);
/*繰り上げ除算*/ll cei(ll x,ll y){ll ans=x/y;if(x%y!=0)ans++;return ans;}
/*最大公約数*/ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
/*最小公倍数*/ll lcm(ll x,ll y){return x/gcd(x,y)*y;}
/*n乗*/ll llpow(ll x,ll n){ll ans=1;rep(i,0,n){ans*=x;}return ans;}
/*階乗*/ll fact(ll x){ll ans=1;rep(i,0,x)ans*=(x-i);return ans;}
/*nCr*/ll ncr(ll n,ll r){return fact(n)*fact(n-r)/fact(r);}
/*nPr*/ll npr(ll n,ll r){return fact(n)/fact(n-r);}
/*primejudge*/bool prime(ll a){if(a<=1)return false;for(i=2;i*i<=a;i++){if(a%i==0)return false;}return true;}
/*Fibonacci数列*/ll fib(ll x){ll fibo[x+10];fibo[0]=1;fibo[1]=1;fibo[2]=1;rep(i,3,x+1)fibo[i]=fibo[i-1]+fibo[i-2];return fibo[x];}
/*桁数*/ll dig(ll n){ll d=1,tmp=n;while(tmp/10>0){tmp/=10;d++;}return d;}
/*行列のコピー*/void matcpy(ll a[S][S],ll b[S][S]){ll t=i;rep(i,0,S)rep(j,0,S)b[i][j]=a[i][j];/*(aをbに)*/i=t;}
/*行列のリセット*/void matrst(ll a[S][S]){ll t=i;rep(i,0,S)rep(j,0,S)a[i][j]=0;i=t;}
/*行列の2乗*/void matpow(ll a[S][S]){ll ans[S][S];matrst(ans);ll t=i,k;rep(i,0,S)rep(j,0,S)rep(k,0,S)ans[i][j]+=a[i][k]*a[k][j];matcpy(ans,a);i=t;}
/*行列の乗算*/void matmul(ll a[S][S],ll b[S][S], ll as[S][S]){ll t=i,k;matrst(as);rep(i,0,S)rep(j,0,S)rep(k,0,S)as[i][j]+=a[i][k]*b[k][j];i=t;}
//ll ans=0;
////////////////////////////////////////////////////////////
int main(){
 ll n;cin>>n;
 bool a[n+10];
 rep(i,1,n+1)sc(a[i]);
 ll box[n+10]={0},c,sum=0;

 rrp(i,n+1,1){
  c=0;
  for(j=2;j*i<=n;j++)c+=box[j*i];
  if(c%2!=a[i]){
   box[i]=1;
   sum++;
  }
 }
 pr(sum);
 rep(i,1,n+1){
  if(box[i]!=0)cout<<i<<" ";
 }
  pnn;
return 0;}

#include <bits/stdc++.h>
#define ll long long
#define rep(i,n) for(int i=0;i<n;i++)
#define Rep(i,a,b) for(int i=a;i<b;i++)
#define REP(i,a,b) for(int i=a;i<=b;i++)
#define rev(i,n) for(int i=n-1;i>=0;i--)
#define vi vector<int>
#define vv vector<vi>
#define pb push_back
#define pi pair<int,int>
#define vp vector<pair<int,int> >
#define mp make_pair
#define all(v) (v).begin(),(v).end()
#define fi first
#define se second
#define INF 100000000000
#define eps 1e-7
#define mod 1000000007
#define int ll
using namespace std;

int A[5*100000 + 10];
int S[5*100000 + 10];

vi idx[(1LL<<20)+10];
//idx[i]:S中の，iの存在するindexのリスト
int zero[5*100000 + 10];
//zero[i]:S中のi番目までに，いくつ０があるか
int dp[5*100000+10];
//dp[i]:i番目まで見たときの場合の数

signed main(void) {
    int N;
    cin>>N;
    S[0]=0;
    zero[0]=0;
    REP(i,1,N) {
        cin>>A[i];
        S[i] = S[i-1]^A[i];
        if (S[i] == 0) zero[i] = zero[i-1]+1;
        else zero[i] = zero[i-1];
        idx[S[i]].pb(i);
//        cerr<<S[i]<<"\t";
    }
//    cerr<<endl;
//    REP(i,1,N) cerr<<zero[i]<<"\t";
//    cerr<<endl;

    if (S[N] == 0) {
        //Sの右端が0のケース
        int ans = 0;
        REP(d,1,1LL<<20) {
//    REP(d,1,8) {
            //まず，dがSのなかにいくつあるのか確認
            int dnum = idx[d].size();
            if (dnum==0) continue;
            //0,d,0,...,d,0だから，必要なdp配列の数はdnum*2+1;
            dp[0]=1; //スタート→１通り
            int from_zero=1;
            int from_d=0;
            REP(i,1,dnum*2) {
                if (i==dnum*2) { //ラス１→絶対右端で止まらないといけないので１通り
                    dp[i] = from_d;
                } else if (i%2==0) { //iが偶数→現在地はd
                    //まず，行き先候補の0の数を計算
                    int znum = (zero[idx[d][i/2]]-zero[idx[d][i/2-1]]) % mod;
                    dp[i] = znum * from_d % mod;
                    from_zero += dp[i];
                    from_zero %= mod;
                } else { //iが奇数→現在地は0
                    dp[i] = from_zero;
                    from_d += dp[i];
                    from_d %= mod;
                }
//            cerr<<dp[i]<<"\t";
            }
//        cerr<<endl;
//        cerr<<"d="<<d<<"の時："<<dp[dnum*2]<<endl;
            ans += dp[dnum*2];
            ans %= mod;
        }
        //d=0でpartitionする場合→2^(0の総数-1)通り
        int pow2 = 1;
        REP(j,1,zero[N]-1) {
            pow2 *= 2;
            pow2 %= mod;
        }
        cout << (ans + pow2) % mod << endl;
    } else { //Sの右端が0でない→それをdとしてやるだけ
        int d=S[N];
        //まず，dがSのなかにいくつあるのか確認
        int dnum = idx[d].size();
        //0,d,0,...,0,dだから，必要なdp配列の数はdnum*2;
        dp[0]=1; //スタート→１通り
        int from_zero=1;
        int from_d=0;
        REP(i,1,dnum*2-1) {
            if (i%2==0) { //iが偶数→現在地はd
                //まず，行き先候補の0の数を計算
                int znum = (zero[idx[d][i/2]]-zero[idx[d][i/2-1]]) % mod;
                dp[i] = (znum * from_d) % mod;
                from_zero += dp[i];
                from_zero %= mod;
            } else { //iが奇数→現在地は0
                dp[i] = from_zero;
                from_d += dp[i];
                from_d %= mod;
            }
//            cerr<<dp[i]<<"\t";
        }
//        cerr<<endl;
//        cerr<<"d="<<d<<"の時："<<dp[dnum*2]<<endl;
        cout << dp[dnum*2-1] % mod << endl;

    }



    return 0;
}