← Home
For problem statement at 1000-1999/1000-1099/1010-1019/1017/problemF.txt this is a correct solution, but verifier at 1000-1999/1000-1099/1010-1019/1017/verifierF.go ends with All tests passed can you fix the verifier? package main

import (
	"fmt"
	"math"
)

func main() {
	var n, A, B, C, D uint32
	_, err := fmt.Scan(&n, &A, &B, &C, &D)
	if err != nil {
		return
	}

	if n <= 1 {
		fmt.Println(0)
		return
	}

	limit := int(math.Sqrt(float64(n)))
	smallIsPrime := make([]bool, limit+1)
	for i := 2; i <= limit; i++ {
		smallIsPrime[i] = true
	}
	var primes []uint32
	for p := 2; p <= limit; p++ {
		if smallIsPrime[p] {
			primes = append(primes, uint32(p))
			for i := p * p; i <= limit; i += p {
				smallIsPrime[i] = false
			}
		}
	}

	var ans uint32 = 0

	if n >= 2 {
		var p uint32 = 2
		fp := A*p*p*p + B*p*p + C*p + D
		count := uint32(0)
		for nn := n / p; nn > 0; nn /= p {
			count += nn
		}
		ans += fp * count
	}

	const S = 1 << 18
	block := make([]uint64, S/64)

	for L := uint32(3); L <= n; L += S * 2 {
		R := L + S*2 - 1
		if R > n {
			R = n
		}
		for i := range block {
			block[i] = 0
		}

		for _, p := range primes {
			if p == 2 {
				continue
			}
			start := (L + p - 1) / p * p
			if start%2 == 0 {
				start += p
			}
			if start < p*p {
				start = p * p
			}

			for i := start; i <= R; i += 2 * p {
				idx := (i - L) / 2
				block[idx/64] |= uint64(1) << (idx % 64)
			}
		}

		for i := uint32(0); i <= (R-L)/2; i++ {
			if (block[i/64] & (uint64(1) << (i % 64))) == 0 {
				p := L + 2*i
				fp := A*p*p*p + B*p*p + C*p + D
				count := uint32(0)
				for nn := n / p; nn > 0; nn /= p {
					count += nn
				}
				ans += fp * count
			}
		}
	}

	fmt.Println(ans)
}