For problem statement at 0-999/900-999/960-969/963/problemE.txt this is a correct solution, but verifier at 0-999/900-999/960-969/963/verifierE.go ends with all tests passed can you fix the verifier? package main
import (
"bufio"
"fmt"
"os"
)
const MOD = 1000000007
func pow(base, exp int) int {
res := 1
base %= MOD
for exp > 0 {
if exp%2 == 1 {
res = (res * base) % MOD
}
base = (base * base) % MOD
exp /= 2
}
return res
}
func main() {
reader := bufio.NewReader(os.Stdin)
var R, a1, a2, a3, a4 int
_, err := fmt.Fscan(reader, &R, &a1, &a2, &a3, &a4)
if err != nil {
return
}
S := a1 + a2 + a3 + a4
invS := pow(S, MOD-2)
p1 := (a1 * invS) % MOD
p2 := (a2 * invS) % MOD
p3 := (a3 * invS) % MOD
p4 := (a4 * invS) % MOD
invP4 := pow(p4, MOD-2)
C := 2*R + 1
V := make([][][]int, 105)
for i := 0; i < 105; i++ {
V[i] = make([][]int, 105)
for j := 0; j < 105; j++ {
V[i][j] = make([]int, C+1)
}
}
for x := -R; x <= R; x++ {
ymin := R + 1
for y := -R; y <= R; y++ {
if x*x+y*y <= R*R {
ymin = y
break
}
}
if ymin <= R {
V[x+52][ymin+52][x+R] = 1
}
}
zeroVector := make([]int, C+1)
getV := func(x, y int) []int {
if x*x+y*y > R*R {
return zeroVector
}
return V[x+52][y+52]
}
equations := make([][]int, 0, C)
for y := -R; y <= R; y++ {
for x := -R; x <= R; x++ {
if x*x+y*y <= R*R {
curr := getV(x, y)
left := getV(x-1, y)
down := getV(x, y-1)
right := getV(x+1, y)
next := make([]int, C+1)
for i := 0; i <= C; i++ {
val := curr[i]
val = (val - p1*left[i]) % MOD
val = (val - p2*down[i]) % MOD
val = (val - p3*right[i]) % MOD
if i == C {
val = (val - 1) % MOD
}
val = (val%MOD + MOD) % MOD
val = (val * invP4) % MOD
next[i] = val
}
V[x+52][y+1+52] = next
if x*x+(y+1)*(y+1) > R*R {
eq := make([]int, C+1)
copy(eq, next)
eq[C] = (MOD - eq[C]%MOD) % MOD
equations = append(equations, eq)
}
}
}
}
n := len(equations)
for i := 0; i < n; i++ {
pivot := i
for j := i; j < n; j++ {
if equations[j][i] != 0 {
pivot = j
break
}
}
equations[i], equations[pivot] = equations[pivot], equations[i]
inv := pow(equations[i][i], MOD-2)
for j := i; j <= C; j++ {
equations[i][j] = (equations[i][j] * inv) % MOD
}
for j := 0; j < n; j++ {
if i != j && equations[j][i] != 0 {
factor := equations[j][i]
for k := i; k <= C; k++ {
equations[j][k] = (equations[j][k] - factor*equations[i][k]) % MOD
if equations[j][k] < 0 {
equations[j][k] += MOD
}
}
}
}
}
res := make([]int, n)
for i := 0; i < n; i++ {
res[i] = equations[i][C]
}
ans := V[52][52][C]
for i := 0; i < C; i++ {
ans = (ans + V[52][52][i]*res[i]) % MOD
}
ans = (ans%MOD + MOD) % MOD
fmt.Println(ans)
}