package main import . "fmt" import . "sort" import . "math" const M = 998244353 func main() { ps := []*P{} for i := 2; i <= 1e6; i++ { for k,v := 3,i*i*i; v <= 1e18; k,v =k+1,v*i { ps=append(ps,&P{v,i,k}) if int(1e18+v-1)/v < i { break } } } Slice(ps, func(i, j int) bool { return ps[i].value < ps[j].value }) var n int Scan(&n) if n > 1e10 { Println(-1) return } ms := make([]int, 60) for i := range ms { ms[i] = 1 } ans := 0 next := 1 for next <= n && len(ps) > 0 { last := ps[0] ps = ps[1:] mm := 1 for _, m := range ms[3:] { mm = mm*m%M } lower := int(Sqrt(float64(next))) upper := int(Sqrt(float64(last.value-1))) for s := lower; s <= upper; s++ { a := s*s b := (s+1)*(s+1)-1 if s == lower { a = next } if s == upper { b = min(n, last.value-1) } t := b*(b+1)/2 - a*(a-1)/2 ans += t%M*s%M*mm%M ans %= M } next = last.value ms[last.power] = last.base for len(ps) > 0 && last.value == ps[0].value { p := ps[0] ps = ps[1:] ms[p.power] = p.base } } Println(ans) } type P struct { value, base, power int }