题目描述 Description
某监狱里有个很长的走廊,走廊中一个接一个的n个房间。每个房间中锁着一个犯人。一天夜里,狱警决定玩一个无聊游戏。第1轮中,他喝了一口威士忌,然后打开每个房间。第2轮,他喝了一口威士忌,然后按2的倍数遍历每个房间。第3轮,他又喝了一口威士忌,遍历所有3的倍数的房间,以此类推。在遍历中,如果房间是锁着的,则打开;否则锁上。他这样重复n轮,最终醉酒。这时囚犯看到自己房间的锁被打开了,他们立即逃跑。对于有n个房间的走廊,最终会有多少囚犯逃脱?
输入描述 Input Description
仅1行: 一个整数,房间数目n(5≤n≤1000000000)。
输出描述 Output Description
仅1行: 一个整数,逃脱的罪犯数量。
样例输入 Sample Input
100
样例输出 Sample Output
10
思路
我天,这居然可以找规律。
不过这个数据范围很明显就是公式啥的,没有啥子算法了啊。。
这个居然是钻石题!?!?!
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int n,ans;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main()
{
n=read();
ans=(int)sqrt(n);
printf("%d",ans);
return 0;
}