#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

int target;
int num_threads;

void* find_factors(void* arg) {
  int start = *((int*)arg);
  for (int i = start; i <= target; i = i + num_threads) {
    if (target % i == 0) {
      printf("%d is a factor\n", i);
    }
  }
  return NULL;
}

/**
 *  Find all nontrivial factors of a given number, using concurrency.
 */
int main(int argc, char** argv) {
  target = atoi(argv[1]);
  num_threads = atoi(argv[2]);
  pthread_t threads[num_threads];

  int starts[num_threads];
  for (int i = 0; i < num_threads; i++) {
    starts[i] = i + 1; // Thread 0 starts with 1, 1 starts with 2, etc.
    pthread_create(&threads[i], NULL, find_factors, &starts[i]);
  }

  for (int i = 0; i < num_threads; i++) 
    pthread_join(threads[i], NULL);

  return 0;
}