P6102-[EER2]諤運算【位運算】

正題

題目鏈接:https://www.luogu.com.cn/problem/P6102?contestId=26472


題目大意

nn個數的序列aa,求
i=1nj=1nk=1nl=1n(ai or aj) xor (ak and al)\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n\sum_{l=1}^n(a_i\ or\ a_j)\ xor\ (a_k\ and\ a_l)


題目大意

每一位分開來求
考慮分開來求,若oror爲1,andand爲0,那麼就是求10至少有一個1的對數*至少有一個是0的對數
oror爲0,andand爲1,那麼就是求01兩個都是0的對數*兩個都是1的對數
顯然這些都很容易求,這裏不再多講


codecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll XJQ=4294967296;
ll n,a[500100],ans;
int main()
{
	scanf("%lld",&n);
	for(ll i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	for(ll i=0;i<32;i++){
		ll one=0,o=0,A=0;
		for(ll j=1;j<=n;j++){
			if(a[j]&(1ll<<i)){
				o=(o+j*2-2)%XJQ;
				A=(A+one*2)%XJQ;
				one++;
				o++;A++;
			}
			else o=(o+one*2)%XJQ;
		}
		o%=XJQ;A%=XJQ;
		ans=(ans+o*((n*n%XJQ-A+XJQ)%XJQ)%XJQ*(1ll<<i)%XJQ)%XJQ;
		ans=(ans+A*((n*n%XJQ-o+XJQ)%XJQ)%XJQ*(1ll<<i)%XJQ)%XJQ;
	}
	printf("%lld",ans);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章