A37147. 开关/门某校有N间教室,且每间教室有2扇门,一共有2 ×N 扇门,每扇门都有编号,分别从1到 2×N 。开始时,所有门为关闭状态。现在按照以下规则对门进行处理:第一次,将所有门打开。第二次,将所有编号为2的倍数的门作相反的处理(原来是打开的就关闭,原来是关闭的就打开)。第三次,将所有编号为3的倍数的门作相反的处理(原来是打开的就关闭,原来是关闭的就打开)。……第N次,将所有编号为N的倍数的门作相…
题目描述
开关/门
某校有N间教室,且每间教室有2扇门,一共有2 ×N 扇门,每扇门都有编号,分别从1到 2×N 。
开始时,所有门为关闭状态。现在按照以下规则对门进行处理:
第一次,将所有门打开。
第二次,将所有编号为2的倍数的门作相反的处理(原来是打开的就关闭,原来是关闭的就打开)。
第三次,将所有编号为3的倍数的门作相反的处理(原来是打开的就关闭,原来是关闭的就打开)。
……
第N次,将所有编号为N的倍数的门作相反的处理(原来是打开的就关闭,原来是关闭的就打开)。
问第N次处理后,有多少扇门为打开状态?
输入格式
输入一个正整数 N (2 ≤ N ≤100) ,代表有 NN 间教室。
输出格式
按照规则对门进行 N次处理之后,计算有多少扇门为打开状态并输出。
样例输入
2
样例输出
2
样例解释
N=2 ,每间教室有 2扇门,一共有 4扇门,门编号分别为 1 , 2 , 3 , 4 。
初始状态:四扇门都为关闭状态。
第一次,将四扇门全部打开。
第二次,将编号为 2 的倍数的门作相反的处理,即将 2 号门和 4 号门关闭。
经过两次处理之后,共有 2 扇门为打开状态。

参考答案
#include <iostream>
using namespace std;
int main() {
int N;
cin >> N;
// 初始化所有门的状态为关闭
bool doors[2 * N];
for (int i = 0; i < 2 * N; i++) {
doors[i] = false;
}
// 按照规则进行N次处理
for (int i = 1; i <= N; i++) {
for (int j = i - 1; j < 2 * N; j += i) {
doors[j] = !doors[j];
}
}
// 统计打开的门的数量
int count = 0;
for (int i = 0; i < 2 * N; i++) {
if (doors[i]) {
count++;
}
}
// 输出结果
cout << count << endl;
return 0;
}答案解析
#include <bits/stdc++.h>
using namespace std;
int n, ans = 0;
bool d[205];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= 2 * n; j++) {
if (j % i)
continue;
d[j] = !d[j];
}
}
for (int i = 1; i <= 2 * n; i++) {
if (d[i])
ans++;
// printf("%d ", d[i]);
}
printf("%d\n", ans);
return 0;
}