自创题目:数列之异或
题解:数列之异或
题目背景
请注意本题特殊的时间和空间限制,并使用较快的输入输出。
题目描述
有 \(n\) 个垃圾,分别占 \(1\) 点至 \(n\) 点空间。使用超能力将垃圾融合,求最终占用的空间。
输入格式
1 个整数 \(n\),表示有多少个垃圾。
输出格式
1 个整数,表示所有垃圾融合完还占多少空间。
解题思路
异或和的性质
从 1 到 n 的异或和(\(\text{XOR}_n\))具有周期性规律:
- 如果 \(n \equiv 0 \pmod{4}\),则 \(\text{XOR}_n = n\)。
- 如果 \(n \equiv 1 \pmod{4}\),则 \(\text{XOR}_n = 1\)。
- 如果 \(n \equiv 2 \pmod{4}\),则 \(\text{XOR}_n = n + 1\)。
- 如果 \(n \equiv 3 \pmod{4}\),则 \(\text{XOR}_n = 0\)。
算法步骤
- 输入处理:以字符串形式读取 \(n\)(因为 \(n\) 可能极大)。
- 计算 \(n \bmod 4\):只需关注最后两位数字。
- 分类讨论:
- \(n \equiv 0 \pmod{4}\):直接输出 \(n\)。
- \(n \equiv 1 \pmod{4}\):输出
1
。 - \(n \equiv 2 \pmod{4}\):计算 \(n + 1\)(字符串加法)。
- \(n \equiv 3 \pmod{4}\):输出
0
。
代码实现
#include<bits/stdc++.h>
using namespace std;
string k;
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>k;
if((k[k.size()-2]*10+k[k.size()-1])%4==1){
cout<<1;
}else if((k[k.size()-2]*10+k[k.size()-1])%4==3){
cout<<0;
}else if((k[k.size()-2]*10+k[k.size()-1])%4==0){
cout<<k;
}else{
k[k.size()-1]++;
cout<<k;
}
return 0;
}
源码:
# 题解:数列之异或
## 题目背景
**请注意本题特殊的时间和空间限制,并使用较快的输入输出。**
## 题目描述
有 $n$ 个垃圾,分别占 $1$ 点至 $n$ 点空间。使用超能力将垃圾融合,求最终占用的空间。
## 输入格式
1 个整数 $n$,表示有多少个垃圾。
## 输出格式
1 个整数,表示所有垃圾融合完还占多少空间。
## 解题思路
### 异或和的性质
从 1 到 n 的异或和($\text{XOR}_n$)具有周期性规律:
- 如果 $n \equiv 0 \pmod{4}$,则 $\text{XOR}_n = n$。
- 如果 $n \equiv 1 \pmod{4}$,则 $\text{XOR}_n = 1$。
- 如果 $n \equiv 2 \pmod{4}$,则 $\text{XOR}_n = n + 1$。
- 如果 $n \equiv 3 \pmod{4}$,则 $\text{XOR}_n = 0$。
### 算法步骤
1. **输入处理**:以字符串形式读取 $n$(因为 $n$ 可能极大)。
2. **计算 $n \bmod 4$**:只需关注最后两位数字。
3. **分类讨论**:
- $n \equiv 0 \pmod{4}$:直接输出 $n$。
- $n \equiv 1 \pmod{4}$:输出 `1`。
- $n \equiv 2 \pmod{4}$:计算 $n + 1$(字符串加法)。
- $n \equiv 3 \pmod{4}$:输出 `0`。
## 代码实现
```cpp
#include<bits/stdc++.h>
using namespace std;
string k;
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>k;
if((k[k.size()-2]*10+k[k.size()-1])%4==1){
cout<<1;
}else if((k[k.size()-2]*10+k[k.size()-1])%4==3){
cout<<0;
}else if((k[k.size()-2]*10+k[k.size()-1])%4==0){
cout<<k;
}else{
k[k.size()-1]++;
cout<<k;
}
return 0;
}