← Home
For problem statement at 0-999/700-799/770-779/773/problemF.txt this is a correct solution, but verifier at 0-999/700-799/770-779/773/verifierF.go ends with mismatch on test 1: expected 0 got 466
exit status 1 can you fix the verifier? package main

import (
	"fmt"
)

func modInverse(a, m int64) int64 {
	m0, x0, x1 := m, int64(0), int64(1)
	if m == 1 {
		return 0
	}
	for a > 1 {
		q := a / m
		a, m = m, a%m
		x0, x1 = x1-q*x0, x0
	}
	if x1 < 0 {
		x1 += m0
	}
	return x1
}

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 main() {
	var maxn, maxa, q int64
	if _, err := fmt.Scan(&maxn, &maxa, &q); err != nil {
		return
	}

	tempQ := q
	a := int64(0)
	for tempQ%2 == 0 {
		a++
		tempQ /= 2
	}
	b := tempQ

	var primes []int64
	temp := q
	for i := int64(2); i*i <= temp; i++ {
		if temp%i == 0 {
			primes = append(primes, i)
			for temp%i == 0 {
				temp /= i
			}
		}
	}
	if temp > 1 {
		primes = append(primes, temp)
	}

	var inv2b int64
	if b > 1 {
		inv2b = modInverse(2, b)
	}

	K := (maxn - 1) / 2
	ans := int64(0)

	for j := int64(1); ; j++ {
		pow2 := int64(1) << j
		if pow2 > maxa {
			break
		}
		X := maxa / pow2
		if X < 1 {
			break
		}
		N := (X - 1) / 2
		if N < 0 {
			continue
		}

		n := 2*N + 2
		maxK := 2*K + a + 1
		binom := make([]int64, maxK+1)
		binom[0] = 1
		V := int64(1)
		E := make([]int64, len(primes))

		for i := int64(1); i <= maxK; i++ {
			if i > n {
				binom[i] = 0
				continue
			}
			num := n - i + 1
			den := i

			for idx, p := range primes {
				for num%p == 0 {
					num /= p
					E[idx]++
				}
				for den%p == 0 {
					den /= p
					E[idx]--
				}
			}

			V = (V * (num % q)) % q
			inv_den := modInverse(den%q, q)
			V = (V * inv_den) % q

			val := V
			for idx, p := range primes {
				if E[idx] > 0 {
					val = (val * power(p, E[idx], q)) % q
				}
			}
			binom[i] = val
		}

		mk := make([]int64, 2*K+a+1)
		for i := int64(0); i <= 2*K+a; i++ {
			mk[i] = binom[i+1]
		}

		Sb := int64(0)
		if b > 1 {
			Q_prev := int64(0)
			for k := int64(0); k <= 2*K; k++ {
				m_val := mk[k] % b
				Qk := (m_val - Q_prev) % b
				if Qk < 0 {
					Qk += b
				}
				Qk = (Qk * inv2b) % b
				if k%2 == 0 {
					Sb = (Sb + Qk) % b
				}
				Q_prev = Qk
			}
		}

		Sa := int64(0)
		if a > 0 {
			modA := int64(1) << a
			for i := int64(0); i <= K; i++ {
				k := 2 * i
				Qk := int64(0)
				for j := int64(1); j <= a; j++ {
					term := mk[k+j] % modA
					term = (term * (int64(1) << (j - 1))) % modA
					if (j-1)%2 == 1 {
						Qk = (Qk - term) % modA
					} else {
						Qk = (Qk + term) % modA
					}
				}
				if Qk < 0 {
					Qk = (Qk%modA + modA) % modA
				}
				Sa = (Sa + Qk) % modA
			}
		}

		var ansN int64
		if a == 0 {
			ansN = Sb % q
		} else if b == 1 {
			ansN = Sa % q
		} else {
			modA := int64(1) << a
			invB := modInverse(b%modA, modA)
			invA := modInverse(modA%b, b)
			term1 := (((Sa * b) % q) * invB) % q
			term2 := (((Sb * modA) % q) * invA) % q
			ansN = (term1 + term2) % q
		}

		ans = (ans + ansN) % q
	}

	fmt.Println(ans)
}