题目:洛谷P3773、UOJ#300、BZOJ4903。
题目大意:
给定一个数列\(a_1, a_2, \dots , a_n\),求有多少个长度大于等于 2 的不上升的子序列满足
$$\prod\limits_{i=2}^k \begin{pmatrix}a_{b_{i-1}} \\ a_{b_i}\end{pmatrix} \mod 2>0 $$
解题思路:
有一个结论:若\(C_{n}^{m}\)是奇数,则(n&m)=m。
然后设\(f_i\)表示以\(i\)结尾的方案数(包括长度为1的),\(p_i\)表示\(i\)的出现位置,我们对每个数,枚举其二进制1的子集,然后若子集存在且位置在当前数的后面,则更新答案即可。
C++ Code:
#include<bits/stdc++.h>
#define N 233335
#define md 1000000007
int a[N],f[N],p[N]={0},n;
int main(){
memset(f,0,sizeof f);
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",a+i);
f[a[i]]=1;
p[a[i]]=i;
}
for(int i=1;i<=n;++i)
for(int j=(a[i]-1)&a[i];j;j=(j-1)&a[i])
if(p[j]>i)
f[j]=(f[j]+f[a[i]])%md;
int ans=0;
for(int i=1;i<=n;++i)
ans=(ans+f[a[i]])%md;
printf("%d\n",(ans-n+md)%md);
return 0;
}