f(y)); for(i=1;i<=n;i++) { scanf("%d",&s[i]); x[i][s[i]]=1; //单个元素也算一个方案 for(j=0;j<1024;j++) //遍历所有值,把前一条分割线的方案全部异或到当前分割线的方案中来 { x[i][j]=(x[i][j]+x[i-1][j])%mod; //传递方案数,这就是x[i]包含了所有x[i-j](j>0)中方案数的原因 x[i][j^s[i]]=(x[i][j^s[i]]+x[i-1][j])%mod; //把这些方案异或当前的这个值得到的新的方案存起来 } } LL sum=0; for(i=n;i>1;i--) { y[i][s[i]]=1; //单个元素也算一个方案 for(j=0;j<1024;j++) //遍历所有值 if(y[i+1][j]) //如果这个值为j的方案数存在 y[i][j&s[i]]=(y[i][j&s[i]]+y[i+1][j])%mod; //那么把这个方案跟当前元素与运算之后得到新方案 for(j=0;j<1024;j++) //把得到的所有新方案加起来 sum=(sum+x[i-1][j]*y[i][j])%mod; for(j=0;j<1024;j++) //把先前的旧方案传递过来 y[i][j]=(y[i][j]+y[i+1][j])%mod; } printf("%I64d\n",sum); } return 0; }
|