题意:给你n个m位数字,若两个数字满足a&b!=a&&a&b!=b的数字对数。
题解:换一个角度说,就是求所有对数减去 a&b==a||a&b==b的情况数目,我们可以通过,高维前缀和求出所有包含关系的数量,然后减去数字i与包含数字i的所有数字的对数,与数字i与自己的对数,就是答案。
AC代码:
#include<stdio.h>
typedef long long ll;
int dp[(1<<21)|5],cnt[(1<<21)|5];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
int k;
scanf("%d",&k);
dp[k]++;cnt[k]++;
}
ll ans=1ll*n*(n-1)/2;
for(int i=0;i<m;i++)
for(int j=(1<<m)-1;j>0;j--)
if(j&(1<<i))
dp[j^(1<<i)]+=dp[j];
for(int i=0;i<(1<<m);i++)
{
ans-=1ll*(dp[i]-cnt[i])*cnt[i];
ans-=1ll*(cnt[i]-1)*cnt[i]/2;
}
printf("%lld\n",ans);
}