题目:洛谷P3773、UOJ#300、BZOJ4903。
题目大意:
给定一个数列(a_1, a_2, dots , a_n),求有多少个长度大于等于 2 的不上升的子序列满足
$$prodlimits_{i=2}^k egin{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 ",(ans-n+md)%md); return 0; }