醉酒的狱卒
某所监狱里有一长串n个牢房,每个牢房都紧挨着。每个牢房里都有一个囚犯,每个牢房都被锁上了。
一天晚上,狱卒感到无聊,决定玩游戏。在游戏的第1回合,他喝了一杯威士忌,然后跑下大厅解锁每个牢房。在第2回合,他喝了一杯威士忌,然后跑下 大厅,锁住其他牢房(2、4、6、?)。在第3回合,他喝了一杯威士忌,然后跑下大厅。他每三个牢房(牢房3,6,9,?如果细胞被锁定,他就会解锁它;如果它被解锁,他会锁定它。他 重复了n轮,喝了最后一杯,然后昏倒了。 一些囚犯,可能是零,意识到他们的牢房被解锁,狱卒没有行动能力。他们立即逃脱。 根据牢房的数量,确定有多少囚犯逃脱监狱。 输入
输入的第一行包含单个正整数。这是后面的行数。以下每一行都包含一个介于 5 和 100 之间的单个整数(包括 5 和 100),即单元格 n 的数量。
输出
对于每行,您必须打印出当监狱有 n 个单元格时越狱的囚犯数。
示例输入 示例输出 |
思路:我们先列一个表找一下规律
原本牢房全是关闭的,第一次会都打开,第二次会把2的倍数的都打开..........我们找一个数字看6 —2,3,6共三次会对其造成影响,经历开-关-开-关,所以进行操作数为奇数时,最后状态为关,操作数为偶数时最后状态为开。我们只需记录一下从2开始他可以被几个数整除就可以,包括其本身。
#include<iostream>
using namespace std;
int n,cnt=0;
int main()
{
int x=0;
cin>>x;
while(x--)
{
cin>>n;
if(n>=4) cnt=2;
else cnt=1;
for(int i=6;i<=n;i++)
{
int ans=0;
for(int j=2;j<=n;j++)
{
if(i%j==0) ans++;
}
if(ans%2==0) cnt++;
}
cout<<cnt<<endl;
}
return 0;
}