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;
}
标签:rd,ch,int,题解,P8034,while
From: https://www.cnblogs.com/operator-/p/17974772