#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion static T[] Range(int n, Func F) => Enumerable.Range(0, n).Select(_ => F()).ToArray(); static int GCD(int x, int y) => y == 0 ? x : GCD(y, x % y); var n = I(); var pz = Range(n, () => I() - 1); var fz = new bool[n]; var ans = new int[n]; for (var s = 0; s < n; s++) { if (pz[s] == s || fz[s]) continue; var gcd = int.MaxValue; var c = -1; var j = s; while (!fz[j]) { fz[j] = true; var p = pz[j]; var d = Math.Abs(p - j); if (gcd == int.MaxValue) gcd = d; else gcd = GCD(gcd, d); j = p; c++; } gcd = GCD(gcd, Math.Abs(s - j)); for (var d = 1; d * d <= gcd; d++) { if (gcd % d == 0) { ans[d] += c; var od = gcd / d; if (od != d) ans[od] += c; } } } Console.WriteLine(string.Join(Environment.NewLine, ans[1..]));