题解 P6102 【[EER2]谔运算】

· · 题解

UPD(2020/5/11):修了之前 x,y 打反的锅。

因为每一位对答案的贡献是独立的,所以我们把每一位分开考虑。

现在问题变成了:给出一个 01 串,求题目中式子的值。

显然,只有以下两种情况会对答案产生 1 的贡献:

本题对二元组没有任何限制,因此这四个二元组的数量都很好计算。

设这个 01 串中有 x0y1,则:

#include <iostream>
using namespace std;
unsigned t[35];
int main()
{
 ios::sync_with_stdio(false);
 unsigned n,tot,ans=0;
 cin>>n;
 tot=n*n;
 for(int i=1;i<=n;i++)
 {
  unsigned x;
  cin>>x;
  for(int j=0;j<=31;j++)
   if((x>>j)&1)t[j]++;
 }
 for(int i=0;i<=31;i++)
 {
  unsigned andn=t[i]*t[i],orn=(n-t[i])*(n-t[i]);
  ans+=(andn*orn+(tot-andn)*(tot-orn))<<i;
 }
 cout<<ans<<endl;
 return 0;
}