首页 > 其他分享 >NOIP2023模拟13联测34 A. origen

NOIP2023模拟13联测34 A. origen

时间:2023-11-07 21:35:06浏览次数:35  
标签:13 sum 34 origen 联测 NOIP2023

NOIP2023模拟13联测34 A. origen

目录

题目大意

给定 \(n\) 个整数 \(a_1,a_2,a_3\cdots a_n\) ,求

\[\sum_{i = 1}^n\sum_{j = i}^n(\oplus_{k = i}^ja_k)^2 \mod 998244353 \]

\(n\le 2 * 10^5 , 0\le a_i \le 2 * 10 ^5\)

思路

设 \(s_i = \oplus_{j = 1}^i a_j\) ,则原式变为:

\[\sum_{i = 0}^{n - 1} \sum_{j = 1}^n (s_i \oplus s_j)^2 \]

按位考虑,一个数可以用二次幂的和来表示。考虑怎么处理平方。

因为:

\[(\sum_{i = 1}^n a_i)^2 = \sum_{i = 1}^i a_i^2+ 2\sum_{i = 1}^{n - 1}\sum_{j = i +1}^n a_i*a_j \]

把两部分分开处理。

先处理前面的那项

把 \(i\) 的每一位分开求贡献,当前处理到第 \(j\) 位

设前 \(i - 1\) 个数这一位为 \(0\) 的数有 \(s0\) 个,为 \(1\) 的数有 \(s1\) 个

那么求这一位的贡献

  • 若当前这一位为 \(1\) :\(2^j*2*s0\)
  • 若当前这一位为 \(0\) :\(2^j*2*s1\)

然后处理后面的那项

先枚举两位 \(j1 , j2\)

当前处理到第 \(i\) 位

设 \(sum_{k , l}\) 为前面 \(i - 1\) 个数的第 \(j1\) 位为 \(k\) ,第 \(j2\) 位为 \(l\) 的个数

设第 \(i\) 个数这两位分别是 \(x , y\)

那么这里的贡献为:\(2 *2^{j1} * 2^{j2} *sum_{!x , !y}\)

code

#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
using namespace std;
const int mod = 998244353 , inf = 2e5;
int n , a[inf + 5] , s[inf + 5] , sum[2][2];
long long ans;
int main () {
    freopen ("origen.in" , "r" , stdin);
    freopen ("origen.out" , "w" , stdout);
    scanf ("%d" , &n);
    fu (i , 1 , n) scanf ("%d" , &a[i]) , s[i] = s[i - 1] ^ a[i];
    for (int j = 1 , l = 1 ; l <= inf ; l <<= 1 , j ++) {
        for (int i = 1 , s0 = 1 , s1 = 0 ; i <= n ; i ++) {
            if ((1 << (j - 1)) & s[i]) 
                ans = (ans + 1ll * l * l * s0 % mod) % mod , s1 ++;
            else 
                ans = (ans + 1ll * l * l * s1 % mod) % mod , s0 ++;
        }
    }
    bool x , y;
    for (int j1 = 1 , l1 = 1 ; l1 <= inf ; l1 <<= 1 , j1 ++) {
        for (int j2 = j1 + 1 , l2 = l1 << 1 ; l2 <= inf ; l2 <<= 1 , j2 ++) {
            sum[0][0] = 1 , sum[0][1] = sum[1][0] = sum[1][1] = 0;
            fu (i , 1 , n) {
                x = s[i] & (1 << (j1 - 1)) , y = s[i] & (1 << (j2 - 1));
                ans = (ans + 2ll * l1 * l2 * sum[!x][!y] % mod) % mod;
                sum[x][y] ++;
            }
        }
    }
    printf ("%lld" , ans);
    return 0;
}

标签:13,sum,34,origen,联测,NOIP2023
From: https://www.cnblogs.com/2020fengziyang/p/17816069.html

相关文章

  • NOIP 模拟13(NOIP A层联测26)
    100+100+20+17,T3按理说应该想到考虑两部分分别的贡献的,明明这个套路很常见。5k:就喜欢这种数据结构专场,多来点。A.origen先前缀和,以下\(p_i\)表示前缀异或和。考虑将一个数\(k\)二进制差分,假设拆成\(2^a+2^b+2^c\),则\(k^2=(2^a+2^b+2^c)\times(2^a+2^b+2^c)\),也就是指数......
  • CF1359D Yet Another Yet Another Task
    貌似没有线段树做法。记\(s\)为\(a\)的前缀和数组。对于一个确定的右端点\(r\)和左端点\(l\),它对于答案的贡献是\(s_r-s_{l-1}-max\{a_i\},l\lei\ler\),如果枚举右端点,令\(c_l=s_{l-1}+max\{a_i\},l\lei\)。那么其实就是要求\(1\lek\ler-1\)的\(min\{c_k\}\)。线......
  • mac os13上安装apache\php\mysql
    macos13上安装1,下载并安装brew,brew是macos上的软件安装工具;2,安装apache2brewinstallhttpd 安装成功后提示:工程文件根目录DocumentRootis/usr/local/var/www配置文件Thedefaultportshavebeensetin/usr/local/etc/httpd/httpd.confto8080andin/usr/local/e......
  • [洛谷 P3481] [BZOJ1118] [POI2009] PRZ-Algorithm Speedup
    题目描述你需要计算一个函数\(F(x,y)\),其中\(x,y\)是两个正整数序列。boolF(std::vector<int>x,std::vector<int>y){if(W(x).size()!=W(y).size())returnfalse;if(W(x).size()==1)returntrue;returnF(p(x),p(y))&&F(s(x),s(y));}\(W......
  • 文心一言 VS 讯飞星火 VS chatgpt (130)-- 算法导论11.2 2题
    二、用go语言,对于一个用链接法解决冲突的散列表,说明将关键字5,28,19,15,20,33,12,17,10插入到该表中的过程。设该表中有9个槽位,并设其散列函数为h(k)=kmod9。文心一言:在这个问题中,我们使用Go语言来解决一个散列(Hash)表的问题,该问题需要我们使用链接法解决冲突。我们的散......
  • IBM System x3400 怎么启动到可以安装?
    IBM服务器安装Windows操作系统的前提条件:IBMServerGuide光盘和Windows光盘。 IBMSystemX3400理论上不支持WindowsServer2000任何一个版本的安装(主要是因为ServerGuide光盘里面没有相关的驱动,在系统安装初始阶段无法加载阵列卡控制器的驱动)。但是你可以使用一个外置的USB......
  • USB转串口芯片对比选秀---推荐CP2102和CH340C
    参考应用文章:《USB转串口芯片你看好哪个(USB转串口芯片介绍)》简短不看版:建议选择这2款芯片:CP2102/CP2104和CH340C。稳定性较好。 1.FT232优势:最常用缺点:假货多,并不是不能用,而是稳定性差。串口容易丢。规格书:https://atta.szlcsc.com/upload/public/pdf/source/20130221/14......
  • day1311
    后缀分类动词后缀-ize(做成;变成;..........化)modernize(现代化)-en(使成为;引起)quicken(加快)-fy(使........化;使成)purify(净化)-ish(使;令)abolish(取消)-ate(成为........;处理)indicate(指示)形容词后缀-able/-ibleflexible(可弯......
  • Day13
    科技发展中的英语词汇工业革命时期英语词汇的特点借词旧词赋新义英语扩张古英语留中古英语引现代英语借词根以及词根的分类什么是词源学?Etymologytheoriginsofwordsthehistoryofwordsthechangingmeaningofwords词源、词根、词缀的关系......
  • 207-nginx 或者tomcat报错:413 Request Entity Too Large
    http{#...client_max_body_size20M;#设置最大允许大小为20MB#...}tomcat413RequestEntityTooLarge<Connectorport="8080"protocol="HTTP/1.1"connectionTimeout="20000"redirectPort=&quo......