[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; }