为了避免水帖,我把最后一题讲一下。
首先我们知道 \bigoplus\limits_{i=1}^n i 的取值是确定的,也就是,
\begin{align*}
\begin{split}
\bigoplus\limits_{i=1}^n i= \left \{
\begin{array}{lr}
1&n\bmod4=1\\
n+1&n\bmod4=2\\
0&n\bmod4=3\\
n&n\bmod4=0\\
\end{array}
\right.
\end{split}
\end{align*}
考虑数学归纳法,
- 当 n=1 时,结论显然成立。
接下来分情况讨论,
- 当 n\bmod4=0 时, n\oplus n+1=1 。
- 当 n\bmod4=1 时, 1\oplus n+1=n+1 。
- 当 n\bmod4=2 时, n+1\oplus n+1=0 。
- 当 n\bmod4=3 时, 0\oplus n=n 。
综上,原命题成立。
下面进入正题部分,考虑先计算出 \bigoplus\limits_{i=1}^{k-1} i 。再计算出需要的 \bigoplus\limits_{i=1}^n i 的值,也就是 \bigoplus\limits_{i=1}^{k-1} i\oplus x 。
最后分类讨论,计算出所需要的 n 。(懒得写了,看代码)
int need=x^calc(k-1);
if(need==0){
for(int i=l;i<=r;i++){
if(i%4==3){
cout<<i<<"\n",ans=0;
break;
}
}
if(ans) puts("-1");
}else if(need==1){
for(int i=l;i<=r;i++){
if(i%4==1){
cout<<i<<"\n",ans=0;
break;
}
}
if(ans) puts("-1");
}else if(need%4==0){
if(l<=need&&need<=r) cout<<need<<"\n";
else puts("-1");
}else if(need%4==3){
if(l<=need-1&&need-1<=r) cout<<need-1<<"\n";
else puts("-1");
}else puts("-1");
其中 calc
为计算 \bigoplus\limits_{i=1}^n i 。