简单拆位求调
查看原帖
简单拆位求调
974277
水星湖psgqwq楼主2024/8/4 00:02
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;
const int N = 3e5 + 5;
int n, a[N], s[N], ans, cnt0, cnt1, sum0, sum1;

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];

    for(int i = 0; i < 30; i++) {
        cnt0 = cnt1 = sum0 = sum1 = 0;
        for(int j = 1; j <= n; j++) {
            s[j] = (a[j] >> i) & 1;
            if(s[j]) {
                cnt1++;
                sum1 = (sum1 + j) % mod;
                ans = (ans + (cnt0 * j % mod - sum0 + cnt0 + mod + 1) % mod * (1 << i) % mod) % mod;
            } else {
                cnt0++;
                sum0 = (sum0 + j) % mod;
                ans = (ans + (cnt1 * j % mod - sum1 + cnt1 + mod) % mod * (1 << i) % mod) % mod;
            }
        }
    }

    cout << ans << endl;
    return 0;
}

2024/8/4 00:02
加载中...