codevs 1399 酗酒的狱警 模拟?解题报告

题目描述 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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值