zufeoj_醉酒的狱卒

题目链接:http://acm.ocrosoft.com/problem.php?cid=1172&pid=43


题目描述

某个监狱有一排、共n间牢房,一间挨一间。每间牢房关着一名囚犯,每间牢房的门刚开始时都是关着的。

有一天晚上,狱卒厌烦了看守工作,决定玩一个游戏。游戏的第1轮,他喝了一杯酒,然后沿着监狱,把所有牢房的门挨个挨个打开;游戏的第2轮,他又喝了一杯酒,然后沿着监狱,把编号为偶数的牢房的门关着;游戏的第3轮,他又喝了一杯酒,然后沿着监狱,对编号为3的倍数的牢房,如果牢房的门开着,则关上,否则打开;...,狱卒重复游戏n轮。游戏结束后,他喝下最后一杯酒,然后醉倒了。

这时,囚犯才意识到他们牢房的门可能是开着的,而且狱卒醉倒了,所以他们越狱了。

给定牢房的数目,求越狱囚犯的人数。

输入

输入文件的第1行为一个正整数,表示测试数据的个数。每个测试数据占一行,为一个整数n,5<=n<=100,表示牢房的数目。

输出

对每个测试数据所表示的牢房数目n,输出越狱的囚犯人数。

样例输入

2
5
100

样例输出

2
10


#include<bits/stdc++.h>
using namespace std;
int vis[111];
int main(){
    int T,n;
    cin>>T;
    while(T--){
        cin>>n;
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++){
            int t=i;
            while(t<=n){
                if(vis[t]==0){
                    vis[t]=1;
                }else{
                    vis[t]=0;
                }
                t+=i;
            }
        }
        int sum=0;
        for(int i=1;i<=n;i++){
            if(vis[i]){
                sum++;
            }
        }
        cout<<sum<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/m0_37345402/article/details/80761246
今日推荐