← Home
package main

import (
	"bufio"
	"os"
	"strconv"
)

func gcd(a, b int) int {
	for b != 0 {
		a, b = b, a%b
	}
	return a
}

type Pair struct {
	g int
	l int
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	if !scanner.Scan() {
		return
	}
	nStr := scanner.Text()
	n, _ := strconv.Atoi(nStr)

	a := make([]int, n)
	for i := 0; i < n; i++ {
		scanner.Scan()
		a[i], _ = strconv.Atoi(scanner.Text())
	}

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	ans := 0
	lastClear := 0
	var merged []Pair

	for r := 1; r <= n; r++ {
		val := a[r-1]
		var nextMerged []Pair
		nextMerged = append(nextMerged, Pair{val, r})

		for _, p := range merged {
			ng := gcd(p.g, val)
			if nextMerged[len(nextMerged)-1].g != ng {
				nextMerged = append(nextMerged, Pair{ng, p.l})
			}
		}
		merged = nextMerged

		matched := false
		for k, p := range merged {
			lMax := p.l
			lMin := lastClear + 1
			if k+1 < len(merged) {
				lMin = merged[k+1].l + 1
			}

			if p.g >= r-lMax+1 && p.g <= r-lMin+1 {
				matched = true
				break
			}
		}

		if matched {
			ans++
			merged = merged[:0]
			lastClear = r
		}

		if r > 1 {
			out.WriteByte(' ')
		}
		out.WriteString(strconv.Itoa(ans))
	}
	out.WriteByte('\n')
}