假设长度为 aia_i 的连续的序列的第一项为 xix_i,那么因为易得 si=ai[xi+(xi+ai1)]2s_i=\cfrac{a_i\cdot[x_i+(x_i+a_i-1)]}{2}

因为题目要求 i=1msi=0\sum_{i=1}^{m} s_i=0,所以可以得到 i=1mai[xi+(xi+ai1)]2=0\sum_{i=1}^{m} \cfrac{a_i\cdot[x_i+(x_i+a_i-1)]}{2}=0

i=1mai[2xi+ai1]2=0\sum_{i=1}^{m} \cfrac{a_i\cdot[2\cdot x_i+a_i-1]}{2}=0

也就是 (i=1mai(ai1)2)+(i=1maixi)=0(\sum_{i=1}^{m} \cfrac{a_i\cdot(a_i-1)}{2})+(\sum_{i=1}^{m} a_i\cdot x_i)=0

通过移项可以得到 i=1mai(ai1)2=i=1maixi\sum_{i=1}^{m} \cfrac{a_i\cdot(a_i-1)}{2}=-\sum_{i=1}^{m} a_i\cdot x_i,所以左边就是一个常数。

根据贝祖定理,当且仅当 gcd(a1,a2,,am)i=1mai(ai1)2\gcd(a_1,a_2,\cdots,a_{m})\mid \sum_{i=1}^m \cfrac{a_i\cdot(a_i-1)}{2} 时有解,通过移项可以得到 2i=1mai(ai1)gcd(a1,a2,,am)2\mid \sum_{i=1}^m \cfrac{a_i\cdot(a_i-1)}{\gcd(a_1,a_2,\cdots,a_{m})}

假设 gcd(a1,a2,,am)=2t(2k+1)\gcd(a_1,a_2,\cdots,a_{m})=2^t\cdot (2k+1) 其中 tt 尽可能大且 kk 为整数,那么设 ci=ai2tc_i=\cfrac{a_i}{2^t}

将上式代入,得到 2i=1m2tci(2tci1)2t(2k+1)2\mid \sum_{i=1}^m \cfrac{2^t\cdot c_i\cdot(2^t\cdot c_i-1)}{2^t\cdot(2k+1)},由于这个式子是由 i=1mai(ai1)gcd(a1,a2,,am)\sum_{i=1}^m \cfrac{a_i\cdot(a_i-1)}{\gcd(a_1,a_2,\cdots,a_{m})} 变形来的,所以一定是一个整数。

因为一个偶数除以一个奇数并不影响奇偶性,所以 2k+12k+1 直接不看,即得到 2i=1mci(2tci1)2\mid \sum_{i=1}^m c_i\cdot(2^t\cdot c_i-1)

t=0t=0 时,等式恒成立,否则需满足 2i=1mci2\mid \sum_{i=1}^m c_i

因为 t=0t=0 只会发生在选择的 mm 个数中出现奇数,所以将奇数的情况单独讨论。

假设奇数有 nn 个,偶数有 mm 个,那么因为只要有奇数就可以,所以方案数为 (2a11)2b(2^{a-1}-1)\cdot 2^b

对于 t0t\ne 0 的情况,假设有 aaaia_i 没有多余的 22bb 个有多余的 22,那么贡献为 2bi=1m/2Ca2i2^b\cdot \sum_{i=1}^{\lfloor m/2\rfloor }C^{2i}_{a}

因为 Cai=Ca1iCa1i1C^i_a=C^i_{a-1}\cdot C_{a-1}^{i-1},所以贡献为 2bi=1a1Ca1i2^b\cdot\sum_{i=1}^{a-1}C^i_{a-1},也就是 aa 个元素的非空子集数量 2b(2a11)2^b\cdot (2^{a-1}-1)

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=2e5+5,mod=1e9+7;
int n,s[N],sum,ans;
int ksm(int a,int b){
    int ans=1;
    while(b){
        if(b&1){
            ans=ans*a%mod;
        }
        b>>=1;
        a=a*a%mod;
    }
    return ans;
}
int f(int x){
    int ans=0;
    while(!(x&1)){
        ans++;
        x>>=1;
    }
    return ans;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin>>n;
    for(int i=1,x;i<=n;i++){
        cin>>x;
        s[f(x)]++;
    }
    for(int i=1;i<=30;i++){
        sum+=s[i];
    }
    ans=(ksm(2,n-sum)-1+mod)%mod*ksm(2,sum)%mod;
    for(int i=1;i<=30;i++){
        sum-=s[i];
        if(s[i]<2){
            continue;
        }
        ans=(ans+ksm(2,sum)%mod*(ksm(2,s[i]-1)-1+mod)%mod)%mod;
    }
    cout<<ans<<'\n';
    return 0;
}