📌  相关文章
📜  门| Sudo GATE 2020 Mock III(2019年1月24日)|问题29(1)

📅  最后修改于: 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)