假设长度为 ai 的连续的序列的第一项为 xi,那么因为易得 si=2ai⋅[xi+(xi+ai−1)] 。
因为题目要求 ∑i=1msi=0,所以可以得到 ∑i=1m2ai⋅[xi+(xi+ai−1)]=0。
即 ∑i=1m2ai⋅[2⋅xi+ai−1]=0。
也就是 (∑i=1m2ai⋅(ai−1))+(∑i=1mai⋅xi)=0。
通过移项可以得到 ∑i=1m2ai⋅(ai−1)=−∑i=1mai⋅xi,所以左边就是一个常数。
根据贝祖定理,当且仅当 gcd(a1,a2,⋯,am)∣∑i=1m2ai⋅(ai−1) 时有解,通过移项可以得到 2∣∑i=1mgcd(a1,a2,⋯,am)ai⋅(ai−1)。
假设 gcd(a1,a2,⋯,am)=2t⋅(2k+1) 其中 t 尽可能大且 k 为整数,那么设 ci=2tai。
将上式代入,得到 2∣∑i=1m2t⋅(2k+1)2t⋅ci⋅(2t⋅ci−1),由于这个式子是由 ∑i=1mgcd(a1,a2,⋯,am)ai⋅(ai−1) 变形来的,所以一定是一个整数。
因为一个偶数除以一个奇数并不影响奇偶性,所以 2k+1 直接不看,即得到 2∣∑i=1mci⋅(2t⋅ci−1)。
当 t=0 时,等式恒成立,否则需满足 2∣∑i=1mci。
因为 t=0 只会发生在选择的 m 个数中出现奇数,所以将奇数的情况单独讨论。
假设奇数有 n 个,偶数有 m 个,那么因为只要有奇数就可以,所以方案数为 (2a−1−1)⋅2b。
对于 t=0 的情况,假设有 a 个 ai 没有多余的 2,b 个有多余的 2,那么贡献为 2b⋅∑i=1⌊m/2⌋Ca2i。
因为 Cai=Ca−1i⋅Ca−1i−1,所以贡献为 2b⋅∑i=1a−1Ca−1i,也就是 a 个元素的非空子集数量 2b⋅(2a−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;
}