首先有个结论:$C_n^m$为奇数当且仅当$m$是$n$的一个子集
于是从后往前推,记录每个数出现的位置,然后对每个位置枚举子集统计在它后面的贡献即可
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=240000; 6 const long long mod=1e9+7; 7 long long a[N],dp[N],pos[N]; 8 long long n,ans; 9 int main() 10 { 11 scanf("%lld",&n); 12 for(int i=1;i<=n;i++) 13 { 14 scanf("%lld",&a[i]); 15 pos[a[i]]=i,dp[i]=1; 16 } 17 for(int i=n;i;i--) 18 { 19 dp[i]=1; 20 for(int j=a[i];j;j=a[i]&(j-1)) 21 if(pos[j]>i) dp[i]=(dp[i]+dp[pos[j]])%mod; 22 ans+=dp[i]; 23 } 24 printf("%lld",(ans-n+mod)%mod); 25 return 0; 26 }