← Home
package main

import (
	"fmt"
	"math"
)

const MOD int64 = 1000000007

func add(a, b int64) int64 {
	return (a + b) % MOD
}

func sub(a, b int64) int64 {
	return (a%MOD - b%MOD + MOD) % MOD
}

func mul(a, b int64) int64 {
	return (a % MOD) * (b % MOD) % MOD
}

func power(base, exp int64) int64 {
	res := int64(1)
	base %= MOD
	for exp > 0 {
		if exp%2 == 1 {
			res = mul(res, base)
		}
		base = mul(base, base)
		exp /= 2
	}
	return res
}

func inv(n int64) int64 {
	return power(n, MOD-2)
}

func main() {
	var m int64
	if _, err := fmt.Scan(&m); err != nil {
		return
	}

	inv6 := inv(6)
	inv30 := inv(30)
	inv42 := inv(42)

	M := m % MOD
	A := mul(mul(M, M+1), M+2)
	B := add(mul(3, M), 4)
	C := sub(0, add(mul(3, M), 6))
	D := int64(2)

	eval6P := func(d int64) int64 {
		d = d % MOD
		d2 := mul(d, d)
		d3 := mul(d2, d)
		res := A
		res = add(res, mul(B, d))
		res = add(res, mul(C, d2))
		res = add(res, mul(D, d3))
		return res
	}

	ans := mul(eval6P(1), inv6)

	limitX := int64(math.Sqrt(float64(m)))

	for x := int64(1); x <= limitX; x++ {
		x2 := x * x
		ans = add(ans, mul(4, mul(eval6P(x2), inv6)))

		maxY := int64(math.Sqrt(float64(m - x2)))
		if maxY < 1 {
			continue
		}

		y := maxY % MOD
		y2 := mul(y, y)
		y3 := mul(y2, y)
		y4 := mul(y2, y2)

		T := mul(mul(y, y+1), add(mul(2, y), 1))

		S0 := y
		S2 := mul(T, inv6)

		term4 := sub(add(mul(3, y2), mul(3, y)), 1)
		S4 := mul(mul(T, term4), inv30)

		term6 := add(sub(add(mul(3, y4), mul(6, y3)), mul(3, y)), 1)
		S6 := mul(mul(T, term6), inv42)

		mx2 := x2 % MOD
		mx4 := mul(mx2, mx2)
		mx6 := mul(mx4, mx2)

		s0 := S0
		s1 := add(mul(mx2, S0), S2)
		s2 := add(add(mul(mx4, S0), mul(mul(2, mx2), S2)), S4)
		s3 := add(add(mul(mx6, S0), mul(mul(3, mx4), S2)), add(mul(mul(3, mx2), S4), S6))

		sum6P := A
		sum6P = mul(sum6P, s0)
		sum6P = add(sum6P, mul(B, s1))
		sum6P = add(sum6P, mul(C, s2))
		sum6P = add(sum6P, mul(D, s3))

		ans = add(ans, mul(4, mul(sum6P, inv6)))
	}

	fmt.Println(ans)
}