using System; using static System.Console; using System.Linq; using System.Collections.Generic; using System.Security.Cryptography; using Microsoft.VisualBasic; class Program { static int NN => int.Parse(ReadLine()); static long[] NList => ReadLine().Split().Select(long.Parse).ToArray(); static long[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray(); public static void Main() { Solve(); } static void Solve() { var n = long.Parse(ReadLine()) - 4; var min = (n + 2) / 3; var max = n; if (min == max) { WriteLine(1); return; } var min1 = min + 1; var max1 = max - 1; if (min % 2 == max % 2) { var add = min * 3 - n; WriteLine((Mountain(min / 2, max / 2, add / 2) + Mountain(min1 / 2, max1 / 2, (add + 3) / 2)) % mod); } else { var add = min * 3 - n; WriteLine((Mountain(min / 2, max1 / 2, add / 2) + Mountain(min1 / 2, max / 2, (add + 3) / 2)) % mod); } } static int mod = 1_000_000_007; static int half = 500_000_004; static long Mountain(long l, long r, long add) { r -= l; l = 0; var c1 = -1L; var c2 = -1L; for (var i = Math.Max(0L, (r - 5) / 4); i <= Math.Min(r, (r + 5) / 4); ++i) { var v1 = i * 3 + add; var v2 = r - i; if (v1 <= v2) c1 = i; if (c2 < 0 && v1 >= v2) c2 = i; } if (c1 == c2) { if (c1 == 0) ++c2; else --c1; } var len1 = (c1 - l + 1) % mod; var len2 = (r - c2 + 1) % mod; return len1 * (len1 - 1) % mod * 3 % mod * half % mod + len1 * (add + 1) % mod + len2 * (len2 + 1) % mod * half % mod; } }