[CTSC2017]吉夫特

题目:洛谷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;
}

 

posted @ 2018-06-14 16:48  Mrsrz  阅读(409)  评论(0编辑  收藏  举报