位运算相关求助优化
  • 板块学术版
  • 楼主Exp10re
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/2/26 11:49
  • 上次更新2024/2/26 17:11:14
查看原帖
位运算相关求助优化
403069
Exp10re楼主2024/2/26 11:49

现在有一段长这样的代码:

#include<bits/stdc++.h>
using namespace std;
const long long MAXN=65536,MAXP=16,Maxn=1e6+7;
long long f[MAXN][MAXP][MAXP],a[Maxn],val[MAXN],n;
inline long long popcnt(long long x)
{
	return x&(-x);
}
int main()
{
	long long i,j;
	scanf("%lld",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
		val[a[i]]++;
	}
	for(i=0;i<=MAXN-1;i++)
	{
		for(j=0;j<=MAXN-1;j++)
		{
			f[i][popcnt(j)][popcnt(j&i)]+=val[j];
		}
	}
	return 0;
}

大致意思就是求出 ff,其中 fc,j,kf_{c,j,k} 等于 aa 中有多少个数能满足 popcnt⁡(ai)=j,popcnt⁡(ai&c)=k\operatorname{popcnt}(a_i)=j,\operatorname{popcnt}(a_i\& c)=k。

现在只想到如上代码的 n2n^2 做法,但是这个玩意看上去很好容斥,本人因为水平问题容斥不出来,求助一下各位大佬们。

2024/2/26 11:49
加载中...