結果
| 問題 |
No.1240 Or Sum of Xor Pair
|
| コンテスト | |
| ユーザー |
pockyny
|
| 提出日時 | 2023-04-26 11:01:25 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 476 ms / 2,000 ms |
| コード長 | 1,539 bytes |
| コンパイル時間 | 3,550 ms |
| コンパイル使用メモリ | 107,204 KB |
| 最終ジャッジ日時 | 2025-02-12 14:09:25 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 |
ソースコード
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
void fwt(vector<ll>& f) {
int n = f.size();
for (int i = 1; i < n; i <<= 1) {
for (int j = 0; j < n; j++) {
if ((j & i) == 0) {
ll x = f[j], y = f[j | i];
f[j] = x + y, f[j | i] = x - y;
}
}
}
}
void ifwt(vector<ll>& f) {
int n = f.size();
for (int i = 1; i < n; i <<= 1) {
for (int j = 0; j < n; j++) {
if ((j & i) == 0) {
ll x = f[j], y = f[j | i];
f[j] = (x + y) / 2, f[j | i] = (x - y) / 2;
}
}
}
}
vector<ll> cnt1(1<<18),cnt2(1<<18);
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
ll i,j,k,n,x; cin >> n >> x;
vector<ll> a(n);
for(i=0;i<n;i++) cin >> a[i];
ll ans = 0;
for(j=0;j<18;j++){
for(i=0;i<(1<<18);i++) cnt1[i] = cnt2[i] = 0;
for(i=0;i<n;i++){
if(!((a[i]>>j)&1)) cnt1[a[i]]++;
cnt2[a[i]]++;
}
fwt(cnt1); fwt(cnt2);
for(i=0;i<(1<<18);i++){
cnt1[i] *= cnt1[i];
cnt2[i] *= cnt2[i];
}
ifwt(cnt1); ifwt(cnt2);
ll sum1 = 0,sum2 = 0;
for(i=0;i<x;i++){
sum1 += cnt1[i]; sum2 += cnt2[i];
}
ans += (sum2 - sum1)*(1LL<<j);
}
for(i=0;i<n;i++) ans -= a[i];
ans /= 2;
cout << ans << "\n";
}
pockyny