Title
大意:给定一个序列,QQQ次询问,l,r,zl,r,zl,r,z,询问在[l,r][l,r][l,r]区间内选出333个数字的按位或的结果等于zzz的方案数。
Solution
Code
#include<cstdio>
#define rep(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
const int N=255,M=1e5+5;
int c[N+5]={0,1,1},s[M][N+5],a[M],n,Q,l,r,z; long long ans=0;
long long C(long long x){return x*(x-1)*(x-2)/6;}
int main(){
scanf("%d%d",&n,&Q);
rep(i,3,N) c[i]=c[i>>1]+(i&1);
rep(i,1,n) scanf("%d",&a[i]);
rep(i,1,n) rep(j,0,N) s[i][j]=s[i-1][j]+(((a[i]&j)==a[i])?1:0);
while(Q--){
scanf("%d%d%d",&l,&r,&z);
rep(j,0,N) ans+=((j&z)==j)?((((c[z]-c[j])&1)?-1:1)*C(s[r][j]-s[l-1][j])):0;
printf("%lld\n",ans),ans=0;
}
return 0;
}