明明已经广为流传,
bzoj
就是不贴题面
uoj
题面传送门吉夫特
考虑 Cmn mod 2≡1 的成立条件
根据 Lucas 定理,有 Cmn mod 2=C⌊m2⌋⌊n2⌋∗Cm mod 2n mod 2
那么如果这个东西最后等于 0 ,一定存在某一位,m 在这一位上为 1 而n 为 0
因为C10 不存在的
那么就能证明,当n & m = m时 Cmn mod 2≡1
那么记 f[i] 为以数字 i 结尾的合法方案数
枚举子集转移就行了
O(3N) 其中 N <script type="math/tex" id="MathJax-Element-2023">N</script>为最大幂次
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 2E5 + 4E4 + 233;
const int mo = 1000000007;
int n,A[maxn],f[maxn],pos[maxn];
#define Add(x,y) ((x) + (y) < mo ? (x) + (y) : (x) + (y) - mo)
#define Dec(x,y) ((x) - (y) >= 0 ? (x) - (y) : (x) - (y) + mo)
inline int getint()
{
char ch = getchar(); int ret = 0;
while (ch < '0' || '9' < ch) ch = getchar();
while ('0' <= ch && ch <= '9')
ret = ret * 10 + ch - '0',ch = getchar();
return ret;
}
int main()
{
#ifdef DMC
freopen("DMC.txt","r",stdin);
#endif
n = getint();
for (int i = 1; i <= n; i++)
A[i] = getint(),pos[A[i]] = i,f[A[i]] = 1;
for (int i = 1; i <= n; i++)
for (int o = A[i] - 1 & A[i]; o; o = o - 1 & A[i])
if (pos[o] > i) f[o] = Add(f[o],f[A[i]]);
int Ans = 0;
for (int i = 1; i <= n; i++)
Ans = Add(Ans,f[A[i]]);
cout << Dec(Ans,n) << endl;
return 0;
}