C++,Migrated from Lutece 1906 开灯问题

/*
Migrated from Lutece 1906 开灯问题
Description
有n盏灯, 编号为1~n. 第1个人把所有灯打开, 第2个人按下所有编号为2的倍数的开关(这些灯将被关掉), 
第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开, 开着的灯将被关闭), 依此类推. 一共有k个人, 问最后有哪些灯开着?

Input
有多组测试数据. 输入的第一行是整数T(0<T≤100), 表示测试数据的组数. 每一组测试数据只有一行, 依次为正整数n和k, 两数之间有一个空格. k<=n<=1000.

Output
对应每组输入, 输出一行还开着灯的编号, 按从小到大的顺序, 每个编号后有一个空格.
*/
#include <iostream>
#include <vector>
int main(){
    int T;std::cin>>T;
    while(T--){
        int n,k;std::cin>>n>>k;
        if(k==0){
            std::cout<<std::endl;
            continue;
        }else if(k==1){
            for(int i=1;i<=n;++i){
                std::cout<<i<<" ";
            }
            std::cout<<std::endl;
            continue;
        }
        std::vector<bool> lights(n+1,true);
        for(int person = 2;person<=k;++person){
            for(int i = person;i<=n;i+=person){
                lights[i]=!lights[i];//按下开关
            }
        }
        for(int i=1;i<=n;++i){
            if(lights[i]){
                std::cout<<i<<" ";
            }
        }
        std::cout<<std::endl;
    }
}
posted @ 2025-03-12 19:11  Kazuma_124  阅读(60)  评论(0)    收藏  举报