ARC133D Range XOR

题目链接:【ARC133D】 Range XOR

非常好数位 dp。

思路

根据异或的前缀和,我们可以把式子化成这样。

\[\sum_{i=l}^r\sum_{j=i}^r [s_j\oplus s_{i-1}==v]
\]

然后先去掉 \(l \leq r\) 的限制。

\[\sum_{i=l-1}^{r-1}\sum_{j=l}^r [s_j\oplus s_i==v]
\]

但是这个玩意没有对称性,很蛋疼,先把区间拉平。

\[\sum_{i=l-1}^r\sum_{j=l-1}^r [s_j\oplus s_i==v]
\]

然后考虑这个式子多算的部分,发现多算的只有 \(i=j\) 的情况和 \((i,j)\) 与 \((j,i)\) 算了 \(2\) 次。

把 \(i=j\) 的部分减去后再除以 \(2\) 就可以得到要的东西。

\[S(n,m)=\sum_{i=0}^n\sum_{j=0}^m[s_i\oplus s_j==v]
\]

最后我们想要求的东西是

\[\sum_{i=l-1}^r\sum_{j=l-1}^r [s_j\oplus s_i==v]=S(r,r)-2S(l-2,r)+S(l-2,l-2)
\]

由于 \(S(r,l-2)=S(l-2,r)\)。

这样子还是很不友好,我们观察一下 \(s_i\) 的性质。

我们会发现

\[s_0=0\\
s_1=1\\
s_2=3\\
s_3=0\\
s_4=4\\
s_5=1\\
s_6=7\\
s_7=0\\
\cdots
\]

显然有规律:

\[s_i=\begin {cases}
i\ \ \ \ \ \ \ \ \ i \equiv 0\ (\mod 4)\\
1\ \ \ \ \ \ \ \ \ i \equiv 1\ (\mod 4)\\
i+1\ \ \ i \equiv 2\ (\mod 4)\\
0\ \ \ \ \ \ \ \ \ i \equiv 3\ (\mod 4)\\
\end{cases}
\]

可以使用数学归纳法证明,证明比较简单,留给读者自行思考。

如果 \(i\equiv 1,3(\mod 4)\) 或 \(j \equiv 1,3 (\mod 4)\) 的话,\(s_i\) 或 \(s_j\) 为常量,直接算就好。

我们先把后两位确定下来,接着删除末两位,消除模 \(4\) 的限制。

剩下的等价求

\[\sum_{i=0}^{\lfloor n/4 \rfloor} \sum_{j=0}^{\lfloor m/4 \rfloor} [l \oplus r == \lfloor v/4 \rfloor]
\]

这里可以考虑先枚举最后两位,如果是 \(1\) 或 \(3\) 可以直接乘一个常量,如果是 \(2\) 或 \(0\) 可以用数位 dp 来解决这个问题。

时间复杂度大概是 \(O(\log n)\)。

CODE

#include<bits/stdc++.h>
using namespace std; #define ll long long const ll mod=998244353;
const int maxn=65,kL=60; ll l,r,v;
ll f[maxn][2][2]; ll kB[4]={0,1,3,0}; ll S(ll i,ll n,ll ln,ll m,ll lm,ll v)
{
if(i==-1) return 1;
ll &fs=f[i][ln][lm];
if(~fs) return fs;
fs=0;
for(ll kn=0,vn=(ln?(n>>i&1):1);kn<=vn;kn++)
{
for(ll km=0,vm=(lm?(m>>i&1):1);km<=vm;km++)
{
if((kn^km)==(v>>i&1)) fs=(fs+S(i-1,n,ln&&kn==vn,m,lm&&km==vm,v))%mod;
}
}
return fs;
}
ll bS(ll n,ll m,ll v)
{
memset(f,-1,sizeof(f));
return S(kL-1,n,1,m,1,v);
}
ll S1(ll n,ll m)
{
if(n<0||m<0) return 0;
ll s=0;
for(ll i=0;i<4;i++)
{
for(ll j=0;j<4;j++)
{
ll w=(v^kB[i]^kB[j]);
if(w&3) continue;
ll ci=(n>>2)-((n&3)<i);
ll cj=(m>>2)-((m&3)<j);
s=(s+bS((i&1)?0:ci,(j&1)?0:cj,w>>2)*((i&1)?(ci+1)%mod:1)%mod*((j&1)?(cj+1)%mod:1)%mod)%mod;
}
}
return s;
}
ll S2(ll l,ll r)
{
return ((S1(r,r)-2*S1(l-1,r)+S1(l-1,l-1))%mod+mod)%mod;
} int main()
{
scanf("%lld%lld%lld",&l,&r,&v);
printf("%lld",(S2(l-1,r)-(v==0)*(r-l+2)%mod+mod)*(mod+1)/2%mod);
}

ARC133D Range XOR的更多相关文章

  1. 421. Maximum XOR of Two Numbers in an Array——本质:利用trie数据结构查找

    Given a non-empty array of numbers, a0, a1, a2, - , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  2. usaco6.1-Cow XOR:trie树

    Cow XOR Adrian Vladu -- 2005 Farmer John is stuck with another problem while feeding his cows. All o ...

  3. android Graphics(三):区域(Range)

    前言:最近几天对画图的研究有些缓慢,项目开始写代码了,只能在晚上空闲的时候捯饬一下自己的东西,今天给大家讲讲区域的相关知识,已经想好后面两篇的内容了,这几天有时间赶紧写出来给大家.有关界面开发的东东内 ...

  4. 【机器学习】神经网络实现异或(XOR)

    注:在吴恩达老师讲的[机器学习]课程中,最开始介绍神经网络的应用时就介绍了含有一个隐藏层的神经网络可以解决异或问题,而这是单层神经网络(也叫感知机)做不到了,当时就觉得非常神奇,之后就一直打算自己实现 ...

  5. 使用Z3破解简单的XOR加密

    使用Z3破解简单的XOR加密 翻译:无名侠 原文地址: https://yurichev.com/blog/XOR_Z3/ 如果我们有一段用简单XOR加密过的文本,怎么寻找密钥呢?密钥的长度可能很长, ...

  6. USACO 6.1 Cow XOR

    Cow XORAdrian Vladu -- 2005 Farmer John is stuck with another problem while feeding his cows. All of ...

  7. x64 QWORD Xor shellcode encoder

    #!/usr/bin/env python #Filename: Xor_QWORD_x64.py #coding=utf-8 import re import sys import random i ...

  8. Project Euler 59: XOR decryption

    计算机上的每个字母都对应一个独特的编号,普遍接受的标准是ASCII(美国信息交换标准代码).例如,大写字母的A的ASCII码是65,星号(*)的ASCII码是42,而小写字母k的代码是107. 一种现 ...

  9. Educational Codeforces Round 71 (Rated for Div. 2) E XOR Guessing (二进制分组,交互)

    E. XOR Guessing time limit per test1 second memory limit per test256 megabytes inputstandard input o ...

  10. XOR Guessing

    ​ E. XOR Guessing 第一次做这种交互题,刚开始还看不懂,现在已经差不多可以理解了,清空缓存区用cout<<endl;即可,需要注意的是,如果用fflush(stdout)来 ...

随机推荐

  1. 聊一聊 C# 中让人惶恐的 Bitmap

    一:背景 1. 讲故事 在.NET高级调试的旅程中,我常常会与 Bitmap 短兵相接,它最大的一个危害就是会让程序抛出匪夷所思的 OutOfMemoryException,也常常会让一些.NET开发 ...

  2. 技术如何通过API接口获取自己想要同款商品的数据

    确定数据源: 首先,你需要确定哪些平台或服务提供商提供了你感兴趣的商品数据.例如,电商平台.品牌商.市场调研公司等. 了解API文档: 访问提供商的开发者门户网站,阅读API文档.文档会详细介绍如何使 ...

  3. 基于 Quanto 和 Diffusers 的内存高效 transformer 扩散模型

    过去的几个月,我们目睹了使用基于 transformer 模型作为扩散模型的主干网络来进行高分辨率文生图 (text-to-image,T2I) 的趋势.和一开始的许多扩散模型普遍使用 UNet 架构 ...

  4. Android Camera2Video整合到自己项目里

    背景: Android项目里调用摄像头拍摄视频,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后来因项目需要,改成了camera2 1.Camera2Video 官方d ...

  5. sql 分组查询并新增序号

    在SQL中,你可以使用ROW_NUMBER()函数来为结果集中的每一行新增一个序号.这个序号是基于某个排序条件的分区排序结果. 以下是一个简单的例子,假设我们有一个名为students的表,它有两列: ...

  6. AI 视觉的应用|ZegoAvatar ⾯部表情随动技术解析

    ​ 一.AI"卷"进实时互动 2021年,元宇宙概念席卷全球,国内各大厂加速赛道布局,通过元宇宙为不同的应用场景的相关内容生态进行赋能.针对"身份"." ...

  7. ASP.NET Core Library – Hangfire

    前言 以前写过 Hangfire 的学习笔记, 但写的很乱. 这篇做个整理. 介绍 Hangfire 是用来做 server task 的, 比如: background job, delay job ...

  8. MyBatisPlus——标准数据层开发

    标准数据层开发 标准数据层CRUD功能 lombok 一个java类库,提供了一组注解,简化POJO实体类开发    常用注解@Data    为当前实体类在编译期设置对应的get/set方法,无参/ ...

  9. 1.2 HELLO 三角形

    这一节,我觉得是相当有难度的.渲染一个三角形,就需要介绍GLSL语言,图形渲染管线(Graphics Pipeline)以及着色器(Shader),标准化设备坐标(NDC)等诸多概念. 图形渲染管线和 ...

  10. Java日期时间API系列24-----Jdk8中java.time包中的新的日期时间API类,MonthDay类源码和应用,对比相同月日时间。

    Java8中为月日新增了类MonthDay,可以用来处理生日,节日.纪念日和星座等周期性问题. 1.MonthDay 特别需要注意的:它的默认打印格式会带前缀"--" ,比如--1 ...