[CTSC2017]吉夫特

题目:洛谷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;
}
原文地址:https://www.cnblogs.com/Mrsrz/p/9183789.html