P8034题解

P8034 [COCI2015-2016#7] Ozljeda

题目传送门

题解

评橙差不多了。

手玩一下样例,很容易发现 \(x\) 的循环节为 \(K+1\),每一段分别为 \(a_1,a_2,a_3,\dots,a_K,\bigoplus_{i=1}^K a_i\) 这几项,然后恰好循环节的异或值为 \(0\),所以就可以直接维护前缀异或值,然后取模求答案。

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int rd() {
	int s=0,m=0;char ch=getchar();
	while(!isdigit(ch)) {if(ch=='-')m=1;ch=getchar();}
	while( isdigit(ch)) s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
	return m?-s:s;
}
int k,a[100005],q,l,r;
signed main() {
	cin>>k;
	for(int i=1;i<=k;i++)
		a[i]=rd(),a[k+1]^=a[i];
	for(int i=1;i<=k+1;i++)
		a[i]^=a[i-1];
	cin>>q;
	while(q--) {
		l=rd(),r=rd();
		printf("%lld\n",a[(r-1)%(k+1)+1]^a[(l-2)%(k+1)+1]);
	}
	return 0;
}

posted @ 2024-01-19 15:32  operator-  阅读(36)  评论(0)    收藏  举报