```go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// Configure fast I/O
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var n int
var x, y int64
// Read n, x, y
fmt.Fscan(reader, &n, &x, &y)
// Max value for elements as per constraints
const MAX_V = 1000000
// Frequency and prefix sum arrays
// Size MAX_V + 2 is sufficient
cnt := make([]int, MAX_V+2)
sum := make([]int64, MAX_V+2)
maxVal := 0
for i := 0; i < n; i++ {
var a int
fmt.Fscan(reader, &a)
cnt[a]++
sum[a] += int64(a)
if a > maxVal {
maxVal = a
}
}
// Compute prefix sums
for i := 1; i <= MAX_V; i++ {
cnt[i] += cnt[i-1]
sum[i] += sum[i-1]
}
// Sieve of Eratosthenes to find primes up to MAX_V + 1
// We might need to check primes slightly larger than maxVal,
// specifically up to maxVal + 1 because we can increase numbers.
limit := MAX_V + 1
isPrime := make([]bool, limit+1)
for i := 2; i <= limit; i++ {
isPrime[i] = true
}
for i := 2; i*i <= limit; i++ {
if isPrime[i] {
for j := i * i; j <= limit; j += i {
isPrime[j] = false
}
}
}
// Initial answer is cost to delete all numbers
ans := int64(n) * x
// Iterate over all prime numbers g
for g := 2; g <= limit; g++ {
if !isPrime[g] {
continue
}
var currentCost int64 = 0
// Iterate through multiples of g
// For each block ((j-1)*g, j*g], the target is j*g (denoted as k here)
for k := g; k <= MAX_V+g; k += g {
// Define the interval [l, r] covered by this multiple k
l := k - g + 1
if l > MAX_V {
break
}
r := k
if r > MAX_V {
r = MAX_V
}
// We need to decide for each number in [l, r] whether to delete or upgrade.
// Upgrade cost: (k - val) * y
// Delete cost: x
// We upgrade if (k - val) * y <= x <==> val >= k - x/y
// Calculate the split point
threshold := int64(k) - x/y
// Determine the start of the upgrade range within [l, r]
// The upgrade range is [max(l, threshold), r]
// The delete range is [l, min(r, upgradeStart - 1)]
upgradeStart := int64(l)
if threshold > upgradeStart {
upgradeStart = threshold
}
// Calculate deletion cost
// Elements in range [l, deleteEnd]
deleteEnd := int64(r)
if upgradeStart - 1 < deleteEnd {
deleteEnd = upgradeStart - 1
}
if int64(l) <= deleteEnd {
count := int64(cnt[deleteEnd] - cnt[l-1])
currentCost += count * x
}
// Calculate upgrade cost
// Elements in range [upgradeStart, r]
realUpStart := upgradeStart
if realUpStart <= int64(r) {
count := int64(cnt[r] - cnt[realUpStart-1])
s := sum[r] - sum[realUpStart-1]
// Cost is sum of (k - val)*y for val in range
// = (count * k - sum(val)) * y
currentCost += (count*int64(k) - s) * y
}
}
if currentCost < ans {
ans = currentCost
}
}
fmt.Fprintln(writer, ans)
}
```