For problem statement at 1000-1999/1800-1899/1840-1849/1848/problemE.txt this is a correct solution, but verifier at 1000-1999/1800-1899/1840-1849/1848/verifierE.go ends with All tests passed can you fix the verifier? package main
import (
"bufio"
"os"
"strconv"
)
func power(base, exp, mod int64) int64 {
res := int64(1)
base %= mod
for exp > 0 {
if exp%2 == 1 {
res = (res * base) % mod
}
base = (base * base) % mod
exp /= 2
}
return res
}
func modInverse(n, m int64) int64 {
return power(n, m-2, m)
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
if !scanner.Scan() {
return
}
x, _ := strconv.ParseInt(scanner.Text(), 10, 64)
scanner.Scan()
q, _ := strconv.ParseInt(scanner.Text(), 10, 64)
scanner.Scan()
M, _ := strconv.ParseInt(scanner.Text(), 10, 64)
xs := make([]int64, q)
for i := int64(0); i < q; i++ {
scanner.Scan()
xs[i], _ = strconv.ParseInt(scanner.Text(), 10, 64)
}
const MAX = 1000000
min_prime := make([]int64, MAX+1)
primes := make([]int64, 0, 80000)
for i := int64(2); i <= MAX; i++ {
if min_prime[i] == 0 {
min_prime[i] = i
primes = append(primes, i)
}
for _, p := range primes {
if p > min_prime[i] || i*p > MAX {
break
}
min_prime[i*p] = p
}
}
count := make([]int64, MAX+1)
ans_mod := int64(1)
m_count := int64(0)
large_mult := int64(1)
addPrime := func(p int64) {
if p == 2 {
return
}
c := count[p]
old_val := c + 1
new_val := c + 2
count[p] = c + 1
temp := old_val
for temp%M == 0 {
temp /= M
m_count--
}
ans_mod = (ans_mod * modInverse(temp, M)) % M
temp = new_val
for temp%M == 0 {
temp /= M
m_count++
}
ans_mod = (ans_mod * (temp % M)) % M
}
temp_x := x
for i := 0; i < len(primes) && primes[i]*primes[i] <= temp_x; i++ {
p := primes[i]
if temp_x%p == 0 {
for temp_x%p == 0 {
addPrime(p)
temp_x /= p
}
}
}
if temp_x > 1 {
if temp_x <= MAX {
addPrime(temp_x)
} else {
large_mult = 2
}
}
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
for i, xi := range xs {
temp_xi := xi
for temp_xi > 1 {
p := min_prime[temp_xi]
addPrime(p)
temp_xi /= p
}
var cur_ans int64
if m_count > 0 {
cur_ans = 0
} else {
cur_ans = (ans_mod * large_mult) % M
}
writer.WriteString(strconv.FormatInt(cur_ans, 10))
if int64(i) < q-1 {
writer.WriteByte(' ')
}
}
writer.WriteByte('\n')
}