package main

import (
	"flag"
	"fmt"
	"sort"
	"sync"
)

func main() {
	n := flag.Int("n", 10, "maximum number to consider")
	flag.Parse()

	type pair struct{ n, c int }
	var pairs []pair
	for n, c := range countFactorsWideSection(*n) {
		pairs = append(pairs, pair{n, c})
	}
	sort.Slice(pairs, func(i, j int) bool { return pairs[i].n < pairs[j].n })
	for _, p := range pairs {
		fmt.Printf("%3d: %3d\n", p.n, p.c)
	}
}

func countFactorsNarrowSection(n int) map[int]int {
	m := map[int]int{}
	var mu sync.Mutex
	var wg sync.WaitGroup

	wg.Add(n - 1)
	for i := 2; i <= n; i++ {
		go func(i int) {
			// NARROW OMIT
			for _, f := range factors(i) {
				mu.Lock() // HL
				m[f]++
				mu.Unlock() // HL
			}
			wg.Done()
		}(i)
	}
	wg.Wait()
	return m
}

func countFactorsWideSection(n int) map[int]int {
	m := map[int]int{}
	var mu sync.Mutex
	var wg sync.WaitGroup

	wg.Add(n - 1)
	for i := 2; i <= n; i++ {
		go func(i int) {
			// WIDE OMIT
			mu.Lock() // HL
			for _, f := range factors(i) {
				m[f]++
			}
			mu.Unlock() // HL
			wg.Done()
		}(i)
	}
	wg.Wait()
	return m
}

func countFactorsSeq(n int) map[int]int {
	m := map[int]int{}
	for i := 2; i <= n; i++ {
		for _, f := range factors(i) { // HL
			m[f]++ // HL
		} // HL
	}
	return m
}

func factors(v int) []int {
	var fs []int
	for v > 1 {
		for f := 2; f <= v; f++ {
			if v%f == 0 {
				v = v / f
				fs = append(fs, f)
				break
			}
		}
	}
	return fs
}
