Processing math: 100%

#容斥,排列组合#U138404 选数字

题目

给定长度为n,n105的序列a,ai,m255,多组询问求

r2i=lr1j=i+1rk=j+1[aiorajorak==m]


分析

直接求显然不行,考虑容斥,
s[i][j]表示前i个数中有多少个数与j按位或为j
那么答案就是

jorm==j(1)cnt[jm]C(s[r][j]s[l1][j],3)


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
typedef long long lll;
const int N=100011,M=256;
int n,Q,s[N][M],a[N],xo[M];
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
inline void print(lll ans){
	if (ans>9) print(ans/10);
	putchar(ans%10+48);
}
inline lll C(int n){return 1ll*n*(n-1)/2*(n-2)/3;}
signed main(){
	n=iut(); Q=iut();
	for (rr int i=1;i<=n;++i){
	    a[i]=iut();
	    for (rr int j=0;j<M;++j)
	        s[i][j]=s[i-1][j]+((j&a[i])==a[i]);
	}
	for (rr int i=1;i<M;++i) xo[i]=xo[i&(i-1)]+1;
	for (rr int i=1;i<=Q;++i){
		rr int l=iut(),r=iut(),x=iut();
		rr lll ans=0;
		for (rr int j=x;j;j=(j-1)&x)
		if (xo[x^j]&1) ans-=C(s[r][j]-s[l-1][j]);
		    else ans+=C(s[r][j]-s[l-1][j]);
		print(ans),putchar(10);
	}
	return 0;
} 
posted @   lemondinosaur  阅读(76)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· Tinyfox 发生重大改版
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· 小米CR6606,CR6608,CR6609 启用SSH和刷入OpenWRT 23.05.5
· 近期最值得关注的AI技术报告与Agent综述!
点击右上角即可分享
微信分享提示