题意:一个序列,q次询问,每次问你某个指定区间内的EXtreme XOR值。
一个长度为l的区间的EXtreme XOR值被定义为,从左到右,将每相邻的两个数XOR起来,产生l-1个新的值,……如此循环,总共l-1次,直到剩下一个值。问的就是这个值是多少。
一个区间的答案,只和每个数被异或的次数的奇偶性有关,而这个被异或的次数恰好是二项展开式的系数,手写观察下。
然后预处理每个长度奇数的位置,记录一下。
#include <iostream>
#include<string.h>
#include<iomanip>
#include<map>
#include<vector>
#include <cstdio>
using namespace std;
#define mod 998244353
#define inf 0x3f3f3f3f
#define N 0x766
#define ll long long
int top;
bool num[10004];
vector<int>dap[10004];
void init()
{
for(int i=1; i<10001; i++)
{
num[1]=num[i]=1;
for(int j=i-1; j>1; j--)
num[j]^=num[j-1];
for(int j=1; j<=i; j++)
{
if(num[j])
dap[i].push_back(j);
}
}
}
int main()
{
init();
int t,n,q,s,e,ts[10004];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d",&ts[i]);
scanf("%d",&q);
printf("Case %d:\n",++top);
for(int i=0; i<q; i++)
{
scanf("%d%d",&s,&e);
int len=e-s+1,ans=0;
int tlen=dap[len].size();
for(int i=0; i<tlen; i++)
ans^=ts[s+dap[len][i]-1];
printf("%d\n",ans);
}
}
return 0;
}
xor(异或)不同返回1,相同返回0。
xor的幺元是0,对奇偶性来说xor和加减法的性质一样。