bestcoders

ZYB loves Xor I

Accepts: 142

Submissions: 696

Time Limit: 2000/1000 MS (Java/Others)

Memory Limit: 65536/65536 K (Java/Others)

问题描述

ZYB喜欢研究Xor,现在他得到了一个长度为n的数组A。于是他想知道:对于所有数对(i,j)(i∈[1,n],j∈[1,n]),lowbit(AixorAj)之和为多少.由于答案可能过大,你需要输出答案对998244353取模后的值
定义lowbit(x)=2k,其中k是最小的满足(x and 2k)>0的数
特别地:lowbit(0)=0

输入描述

一共T(T≤10)组数据,对于每组数据:
第一行一个正整数n,表示数组长度
第二行n个非负整数,第i个整数为Ai
n∈[1,5?104],Ai∈[0,229]

输出描述

每组数据输出一行Case #x: ans。x表示组数编号,从1开始。ans为所求值。

输入样例

2
5
4 0 2 7 0
5
2 6 5 4 0

输出样例

Case #1: 36

Case #2: 40
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>

using namespace std;

const long long MOD = 998244353;
const int maxn = 30;
const int M = 2;
long long  ans;

struct Node
{
    int v;
    Node *next[M];
};

struct Tree
{
    Node *root;
    int v;

    Tree()//constructor
    {
        root = new Node;
        root->v = 0;
        for(int i=0; i<M; i++)
            root->next[i] = NULL;
    }

    void insert(int t)
    {
        Node *p = root, *q;

        for(int i=0; i<maxn; i++)
        {
            int tmp = t&(1<<i);
            if(tmp) tmp = 1;
            if(p->next[tmp] == NULL)
            {
                q = new Node;
                q->v = 1;
                for(int i=0; i<M; i++)
                    q->next[i] = NULL;
                p->next[tmp] = q;
                p = q;
            }
            else
            {
                p = p->next[tmp];
                p->v++;
            }
        }
    }

    void find(int t)
    {
        Node *p = root;
        for(int i=0; i<maxn; i++)
        {
            long long tmp = t&(1<<i);
            if(tmp) tmp = 1;
            if(p->next[tmp^1] != NULL)
                ans = (ans + (p->next[tmp^1]->v)*(long long)(1<<i)) % MOD;
            p = p->next[tmp];
        }
    }
};

const int N = 50005;
int a[N];
int kase = 0;

int main()
{
    int T, n;
    scanf("%d", &T);
    while(T--)
    {
        ans = 0;
        Tree tree;
        scanf("%d", &n);
        for(int i=0; i<n; i++)
            {
                scanf("%d", &a[i]);
                tree.insert(a[i]);
            }
        for(int i=0; i<n; i++)
            tree.find(a[i]);
        printf("Case #%d: %I64d\n", ++kase, ans);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 15:13:03

bestcoders的相关文章

bestcoders pog love szhIII

pog loves szh III Accepts: 63 Submissions: 483 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) 问题描述 pog在与szh玩游戏,首先pog在纸上画了一棵有根树,这里我们定义1为这棵树的根,然后szh在这棵树中选了若干个点,想让pog帮忙找找这些点的最近公共祖先在哪里,一个点为S的最近公共祖先当且仅当以该点为根的子树包含S中的所有点

bestcoders Happy Birthday

Happy birthday Accepts: 178 Submissions: 511 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 今天是Gorwin的生日.所以她的妈妈要实现她的一个愿望.Gorwin说她想吃很多蛋糕.所以他妈妈带她来到了蛋糕园. 这个园子被分成了n*m个方格子.在每一个格子里面,有一个蛋糕.第i行,第j列的格子中有一个重量为wij千克的蛋糕,Gor

[精通Objective-C]键值编程

[精通Objective-C]键值编程 参考书籍:<精通Objective-C>[美] Keith Lee 目录 精通Objective-C键值编程 目录 键值编码KVC 键值观察KVO 键值编码KVC 键值编码API可以直接访问类的属性: @interface Hello : NSObject @property NSString* greeting; @end @implementation Hello -(id)init{ if ((self = [super init])) { _gr