#nullable enable using System.Numerics; #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Trim().Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion static T[] Range(int n, Func F) => Enumerable.Range(0, n).Select(_ => F()).ToArray(); long Naive(int N, int n) { var res = (long)n * (n + 1) / 2 + 1; for (var d = 3; d <= n; d++) { var theta = Math.PI * 2 / d; var r = new Complex(Math.Cos(theta), Math.Sin(theta)); var rz = new Complex[d + 1]; rz[0] = 1; for (var i = 1; i < d; i++) rz[i] = rz[i - 1] * r; var l = n - d; var a = new int[l]; var ds = new HashSet(); void S(int j, int next) { if (j == l) { var s = new HashSet<(Complex, int)>(){ (1, 0) }; for (var i = 0; i < l; i++) { var rot = rz[a[i]]; var ns = new HashSet<(Complex, int)>(); foreach (var k in s) { var (kv, kc) = k; ns.Add(k); ns.Add((kv * rot, kc + 1)); } s = ns; } var ims = new double[l + 1]; foreach (var (kv, kc) in s) ims[kc] += kv.Imaginary; for (var i = 0; i <= l; i++) if (Math.Abs(ims[i]) > 0.000001) return; var hash = 0L; for (var i = 0; i < l; i++) hash = hash * (N + 2) + a[i] + 1; ds.Add(hash); return; } for (var i = next; i <= d; i++) { a[j] = i; S(j + 1, i); } } S(0, 0); res += ds.Count; } return res; } // var N = 10; // var ll = new List(); // for (var n = 1; n <= N; n++) // { // var res = Naive(N, n); // ll.Add(res); // } // Console.WriteLine(string.Join(",", ll)); var N = I(); Console.WriteLine(Naive(N, N));