多比特杯武汉工程大学第四届ACM程序设计竞赛同步赛 自习室的灯

题目描述
在若干年之后,WIT终于实现了学生的自习室自由,给每个同学都安排上了一间单独的自习室,每间自习室都有一盏灯,the shun手里恰好有个控制面板能开关任意一间自习室的灯。
现在假设WIT有n名学生(此时the shun早就毕业辣,所以不算在内),也就会有n间教室,the shun突发奇想,把教室从1到n编号,从1开始,反转一下能整除数字1的房间号的对应房间灯的开关,然后再反转能整除数字2的房间的开关,再反转能整除数字3的房间的开关......再反转能整除数字n的房间的开关。请问经过n次反转之后,有几间房的灯是开着的,并输出开灯的房间号。房间的灯开始全是熄灭的,反转开关就是指如果灯亮着就熄灭,熄灭就点亮。
输入描述:
一个数字n,代表学校有n名学生(1<=n<=1e10)
输出描述:
第一个数字k,代表最终有k个房间亮着灯,后面接k个从小到大的数字,表示房间号。数字用空格分开。

示例1

输入

复制1

1

输出

复制1 1

1 1

示例2

输入

复制2

2

输出

复制1 1

1 1

示例3

输入

复制3

3

输出

复制1 1

1 1

提示:由于本题数据范围较大,故可直接排除模拟,分析一下题意,由于刚开始的时候所有的灯都熄灭,所以到最后还亮着的灯的开关必定被按了奇数次,所以就可以以此为方向进行分析,如果能整除,所以该数必定为某房间号的因数,所以此时就可以寻找因数个数为奇数的房间号,也就是说到最后开灯的房间号的开根号必定为一实数,既只需要找出一个最大的平方小于n的数即可。

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网

#include <bits/stdc++.h>
#define ll long long
const int N=100010;
using namespace std;
int main(){
    ll n;
    cin>>n;
    cout<<int(sqrt(n))<<" ";
    for(ll i=1;i<=int(sqrt(n));i++){
        ll x=i*i;
        cout<<i*i<<" ";
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值