吐槽:
我语文不好!
T1,T3的题面看不懂 读了40分钟还是不懂
至于难度,两个字:呵呵~;
T2:
lowbit(a ^ b) =>
a,b在二进制中,从左向右,a和b第一个不同的数;
可以用Trie树来做,记录每个节点
1的儿子数和0的儿子数;
最后dfs遍历整棵树统计答案;
注意:
不要忘记取模;
取模要彻底(对所有的乘都要取模)!!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lc(x) ch[x][0]
#define rc(x) ch[x][1]
using namespace std;
const int mod = 998244353,MAXN = 600001;
int a[MAXN],ch[MAXN*8][2],cnt,siz[MAXN*8][2];
int sum,n,T,tot;
int read()
{
char c = getchar();
int ss = 0,flag=1;
while(c < '0' || c > '9')
{
if(c == '-') flag = -1;
c = getchar();
}
while(c >= '0' && c <= '9')
{
ss = ss * 10 + c - '0';
c = getchar();
}
return ss * flag;
}
struct Trie
{
void insert(int x)
{
int rt = 0;
for(int i = 0;i <= 31;i ++ )
{
int p = (x >> i) & 1;
if(!ch[rt][p]) ch[rt][p] = ++cnt;
siz[rt][p]++;
rt = ch[rt][p];
}
return;
}
void dfs(int rt,int k)
{
if(k>31) return;
if(siz[rt][0] && siz[rt][1])
sum = (sum % mod + (1 << (k + 1)) % mod * siz[rt][0] % mod * siz[rt][1] % mod) % mod;
if(lc(rt)) dfs(lc(rt),k + 1);
if(rc(rt)) dfs(rc(rt),k + 1);
return;
}
}trie;
void init()
{
memset(ch,0,sizeof(ch));
memset(siz,0,sizeof(siz));
sum = 0;
cnt = 0;
return;
}
void solve()
{
T=read();
while(T--)
{
init();
n=read();
for(int i = 1;i <= n;i ++) a[i]=read(),trie.insert(a[i]);
trie.dfs(0,0);
printf("Case #%d: %d\n",++tot,sum%mod);
}
return;
}
int main()
{
solve();
return 0;
}