描述

假设有N盏灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;有M个人(M为不大于N的正整数)也从1到M依次编号。

第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。

请问:当第M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。


格式

输入格式

输入正整数N和M,以单个空格隔开。

输出格式

顺次输出关闭的灯的编号,其间用逗号间隔。


样例

输入样例

10
10

输出样例

1,4,9


限制

时间限制:1000 ms
内存限制:65536 KB


代码:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i,j=2,x[1001],n,d,r;
  5. scanf("%d%d",&d,&r);
  6. for (i=1;i<=d;i++)//灯的编号
  7. x[i]=i;
  8. while (j<=r)
  9. {
  10. for (i=j;i<=d;i++) //灯数从等于人数开始
  11. {
  12. if (i%j==0) //是人的倍数
  13. {
  14. if (x[i]!=0)//不为0则要关灯
  15. x[i]=0;
  16. else //为0则要开灯
  17. x[i]=i;
  18. }
  19. }
  20. j++; //下一个人数
  21. }
  22. int flag=0;
  23. for (i=1;i<=d;i++)
  24. {
  25. if(flag==1)
  26. {
  27. goto t;
  28. }
  29. if (x[i]!=0)
  30. {
  31. printf("%d",x[i]);
  32. flag=1;
  33. goto y;
  34. }
  35. t:
  36. if (x[i]!=0)
  37. {
  38. printf(",%d",x[i]);
  39. }
  40. y:
  41. flag=1;
  42. }
  43. printf("\n");
  44. }