Use this to learn the idea, then write your own version.
1package main2 3import (4 . "fmt"5 "io"6)7 89func cf498C(in io.Reader, out io.Writer) {10 var n, m, v int11 Fscan(in, &n, &m)12 type pair struct{ p, e int }13 ps := make([][]pair, n)14 sum := make([]int, n+1)15 for i := range ps {16 Fscan(in, &v)17 for p := 2; p*p <= v; p++ {18 if v%p > 0 {19 continue20 }21 e := 122 for v /= p; v%p == 0; v /= p {23 e++24 }25 ps[i] = append(ps[i], pair{p, e})26 }27 if v > 1 {28 ps[i] = append(ps[i], pair{v, 1})29 }30 sum[i+1] = sum[i] + len(ps[i])31 }32 33 st := sum[n]34 end := st + 135 type nb struct{ to, rid, cap int }36 g := make([][]nb, end+1)37 addEdge := func(from, to, cap int) {38 g[from] = append(g[from], nb{to, len(g[to]), cap})39 g[to] = append(g[to], nb{from, len(g[from]) - 1, 0})40 }41 42 for i, ps := range ps {43 if i%2 == 0 {44 for j, p := range ps {45 addEdge(st, sum[i]+j, p.e)46 }47 } else {48 for j, p := range ps {49 addEdge(sum[i]+j, end, p.e)50 }51 }52 }53 54 for range m {55 var a, b int56 Fscan(in, &a, &b)57 a--58 b--59 if a%2 > 0 {60 a, b = b, a61 }62 for i, p := range ps[a] {63 for j, q := range ps[b] {64 if p.p == q.p {65 addEdge(sum[a]+i, sum[b]+j, 1e9)66 }67 }68 }69 }70 71 d := make([]int, len(g))72 bfs := func() bool {73 clear(d)74 d[st] = 175 q := []int{st}76 for len(q) > 0 {77 v := q[0]78 q = q[1:]79 for _, e := range g[v] {80 if w := e.to; e.cap > 0 && d[w] == 0 {81 d[w] = d[v] + 182 q = append(q, w)83 }84 }85 }86 return d[end] > 087 }88 iter := make([]int, len(g))89 var dfs func(int, int) int90 dfs = func(v, totalFlow int) (curFlow int) {91 if v == end {92 return totalFlow93 }94 for ; iter[v] < len(g[v]); iter[v]++ {95 e := &g[v][iter[v]]96 if w := e.to; e.cap > 0 && d[w] > d[v] {97 f := dfs(w, min(totalFlow-curFlow, e.cap))98 if f == 0 {99 continue100 }101 e.cap -= f102 g[w][e.rid].cap += f103 curFlow += f104 if curFlow == totalFlow {105 break106 }107 }108 }109 return110 }111 maxFlow := 0112 for bfs() {113 clear(iter)114 maxFlow += dfs(st, 1e9)115 }116 Fprint(out, maxFlow)117}118 119120