现在有一段长这样的代码:
#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;
}
大致意思就是求出 f,其中 fc,j,k 等于 a 中有多少个数能满足 popcnt(ai)=j,popcnt(ai&c)=k。
现在只想到如上代码的 n2 做法,但是这个玩意看上去很好容斥,本人因为水平问题容斥不出来,求助一下各位大佬们。