关于first在数组中的用法

问题遇到的现象和发生背景 不懂这个first在里面的用处是什么,
问题相关代码,请勿粘贴截图
#include<stdio.h>
#include<string.h>
#define maxn 1010
int a[maxn];
int main()
{
  int n, k, first=1;
  memset(a, 0, sizeof(a));
  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];
  for(int i =1;i<=n;i++)
   if(a[i])
   {
     if(first)first=0;
     else printf(" ");
     printf("%d", i);
   }
   printf("\n");
   return 0;
}

###### 运行结果及报错内容 if(a[i])
   {
     if(first)first=0;
     else printf(" ");
     printf("%d", i);
   }
   printf("\n");

我的解答思路和尝试过的方法 这段里first是怎么变换的
我想要达到的结果

first用于控制空格的输出
在第一个输出数字之前不需要空格,第一个数字之后,每输出一个数字时,需要先输出一个空格