自创题目:数列之异或

题解:数列之异或

题目背景

请注意本题特殊的时间和空间限制,并使用较快的输入输出。

题目描述

\(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

代码实现

#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;
}
posted @ 2025-07-02 16:41  XLoffy  阅读(24)  评论(0)    收藏  举报