#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef vector VI; typedef pair PII; #define REP(i,s,t) for(int i=(s);i<(t);i++) #define FILL(x,v) memset(x,v,sizeof(x)) const int INF = (int)1E9; #define MAXN 200005 #define MAXSEG (MAXN<<2) const int mod = 998244353; int n; ll a[MAXN], rAnd[MAXN]; int val[MAXSEG], nzLeft[MAXN]; void add(int k, int nl, int nr, int i, int v){ if(i < nl || i > nr) return; if(nl == nr) { val[k] = (val[k] + v) % mod; return; } int nm = (nl+nr)>>1; add(2*k+1, nl, nm, i, v); add(2*k+2, nm+1, nr, i, v); val[k] = (val[2*k+1] + val[2*k+2]) % mod; } ll get(int k, int nl, int nr, int l, int r){ if(rnr) return 0; if(l<=nl && nr<=r) return val[k]; int nm = (nl+nr)>>1; return (get(2*k+1, nl, nm, l, r) + get(2*k+2, nm+1, nr, l, r)) % mod; } int solve(ll leftAnd) { FILL(val, 0); int sol = 0; ll leftRoll = -1; int iEnd = leftAnd == 0 ? n : n - 1; REP(i,0,iEnd) { leftRoll &= a[i]; int pre = get(0, 0, n - 1, max(0, nzLeft[i] - 1), i - 1); if (leftAnd > 0 && (rAnd[i + 1] & leftAnd) > 0) sol = (sol + pre) % mod; if ((leftAnd > 0 && leftRoll == leftAnd) || (leftAnd == 0 && leftRoll > 0)) pre = (pre + 1) % mod; add(0, 0, n - 1, i, pre); } if (leftAnd == 0) sol = get(0, 0, n - 1, n - 1, n - 1); return sol; } int main() { cin >> n; set leftAnd; ll la = -1; VI lastZero(60, -1); REP(i,0,n) { cin >> a[i]; la &= a[i]; leftAnd.insert(la); nzLeft[i] = i; REP(b,0,60) { if ((a[i] & (1LL << b)) == 0) lastZero[b] = i; nzLeft[i] = min(nzLeft[i], lastZero[b] + 1); } } leftAnd.insert(0); rAnd[n] = -1; for (int i = n - 1; i >= 0; i--) rAnd[i] = a[i] & rAnd[i + 1]; int ans = 0; for (auto &v: leftAnd) ans = (ans + solve(v)) % mod; cout << ans << endl; return 0; }