#容斥# [校测 选数字]

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; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值