有n盏灯, 编号为1~n. 第1个人把所有灯打开, 第2个人按下所有编号为2的倍数的开关(这些灯将被关掉), 第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开, 开着的灯将被关闭), 依此类推. 一共有k个人, 问最后有哪些灯开着?
Standard Input
有多组测试数据. 输入的第一行是整数T(0<T≤100), 表示测试数据的组数. 每一组测试数据只有一行, 依次为正整数n和k, 两数之间有一个空格. k<=n<=1000.
Standard Output
对应每组输入, 输出一行还开着灯的编号, 按从小到大的顺序, 每个编号后有一个空格.
Samples
Input | Output |
---|---|
3 7 3 15 10 20 7 | 1 5 6 7 1 4 9 11 12 13 14 15 1 4 8 10 11 12 13 14 15 16 17 19 |
Problem ID | 1906 |
Problem Title | 开灯问题 |
Time Limit | 1000 ms |
Memory Limit | 64 MiB |
Output Limit | 64 MiB |
Source | wxiaoping - 2018.4.24 |
#include <stdio.h>
#include <string.h>
int res[100][1000];
int a[1001];
int main() {
int T;
scanf("%d\n",&T);
for(int x = 0; x < T; x++){
int n, k,q, first = 1;
memset(a, 0, sizeof(1));
scanf("%d%d", &n, &k);
for (int i = 1; i <= k; i++)
for (int j = 1; j <= n; j++)
if(j % i == 0)
a[j] = !a[j];
q = 0;
for (int i = 1; i <= n; i++)
if (a[i]) {
res[x][q] = i;
q++;
}
}
for(int i = 0;i<T;i++){
for(int x = 0;x<1000;x++){
if(res[i][x]!=0){
printf("%d ",res[i][x]);
}
else{
printf("\n");
break;
}
}
}
return 0;
}