📅  最后修改于: 2023-12-03 15:42:19.996000             🧑  作者: Mango
本题是关于门的问题。有n扇门,每扇门可能是开着的,也可能是关着的。现在需要对这n扇门进行依次操作,对于每扇门,如果开着就把它关上,如果关着就把它打开。具体来说,第i轮操作是将状态为 i 的倍数的门取反。问经过n轮操作之后,有多少扇门是开着的。
给定参数: $n$(1≤ n ≤ 10^3)
本题是一道简单的模拟题,需要依次对每个门进行n轮取反操作,最后输出开着的门的数量。
对于一个数i,若其有$j$个因数,则i经j轮操作后,状态不变。而j为奇数时,开关状态将取反。
因此,对于每扇门我们只需要计算其因数个数j,如果j为奇数,则最后门的开关状态会取反,否则状态不变。统计最终开着的门的数量即可。
C++代码实现:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,a[N],cnt;
int getNum(int x) {
int cnt=0;
for(int i=1;i<=sqrt(x);i++){
if(x%i==0) {
if(x/i==i) cnt++;
else cnt+=2;
}
}
return cnt;
}
int main() {
cin>>n;
for(int i=1;i<=n;i++){
a[i]=getNum(i);
if(a[i]%2==1) cnt++;
}
cout<<cnt;
return 0;
}
Python代码实现:
import math
n=int(input())
cnt=0
def getNum(x):
cnt=0
for i in range(1,int(math.sqrt(x))+1):
if x%i==0:
if x//i==i:
cnt+=1
else:
cnt+=2
return cnt
for i in range(1,n+1):
if getNum(i)%2==1:
cnt+=1
print(cnt)