http://acm.hdu.edu.cn/showproblem.php?pid=5269
据说官方题解是用trie做的,然而弱只能递归
#include <stdio.h>
#include <string.h>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
const int mod=998244353;
typedef long long ll;
int lowbit (ll x)
{
int i=0;
while(((1<<i)&x)==0)
i++;
return i;
}
inline ll low(ll x)
{
return x&-x;
}
ll solve (vector<ll> p) {
ll ans,t=0,c=0;
int i,n;
n=p.size();
if(n==0)
return 0;
vector <ll> a[31];
for(i=0;i<p.size();i++) {
if(p[i])
a[lowbit(p[i])].push_back(p[i]-low(p[i]));
else
c++;
t=(t+low(p[i]))%mod;
}
ans=t*c*2%mod;
n=n-c;
for(i=0;n;i++) {
ans=(ans+2*(1<<i)*(n-a[i].size())*a[i].size())%mod;
ans=(ans+solve(a[i]))%mod;
n=n-a[i].size();
}
return ans;
}
int main ()
{
freopen("aa.txt","r",stdin);
int T,cas,i,n,k;
ll ans,tt;
scanf("%d",&T);
for(cas=1;cas<=T;cas++) {
scanf("%d",&n);
vector <ll> q;
for(i=1;i<=n;i++) {
scanf("%I64D",&tt);
q.push_back(tt);
}
ans=solve(q);
cout<<"Case #"<<cas<<": "<<ans<<endl;
}
}