nefu 6 通宵教室 详解

http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=6

题意: 教室里面有n盏灯分别标号1,2,3……n。最开始所有灯都是灭的,有n个同学顺序进入教室,当第一个同学进入教室时,灯全亮;当第二个同学进入教室时,标号为偶数的灯熄灭;当第三个同学进入教室时,执行如下操作: 标号为3的倍数的灯如果是灭的,就把它打开;如果是开的,就把它熄灭;
问这样下去,最后亮着的灯有多少盏。(1<=n<2^32)

分析:数据很大无法直接模拟。
(1) 但是我们很容易发现出规律:如果一盏灯最后是亮的,那么这盏灯的标号一定有奇数个因子,如果标号有偶数个因子,那么一定是灭的。
举个例子: 标号为4的那盏灯 因子:1,2,4
第一个人进去,亮
第二个人进去,灭
第四个人进去,亮

(2) 有结论(1)之后,还需要另一个数学知识
我们可以知道一个大于1的数 n,肯定有两个约数1和n,那么现在当且仅当 n有一个因子i,当i*i=n的时候,n的因子个数才是奇数个。
满足条件的灯的标号依次是:1,4,9,16,25….n^2
(3)综上所述:给定一个整数n,(int)sqrt(n)即为所求;

#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;

int main(int argc, char *argv[])
{int n;
 long long m;
 while(cin>>n)
 {for(int i=0;i<n;i++)
     {
          cin>>m;
          cout<<(int)sqrt(m)<<endl;           
     }
 }


  return 0;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值