解题:CTSC 2017 吉夫特

题面

首先有个结论:$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 }
View Code
原文地址:https://www.cnblogs.com/ydnhaha/p/9842153.html