← Home
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')
}