Problem:
Score : 500 points

Problem Statement

We have N integers. The i-th number is A_i.

\{A_i\} is said to be pairwise coprime when GCD(A_i,A_j)=1 holds for every pair (i, j) such that 1\leq i < j \leq N.

\{A_i\} is said to be setwise coprime when \{A_i\} is not pairwise coprime but GCD(A_1,\ldots,A_N)=1.

Determine if \{A_i\} is pairwise coprime, setwise coprime, or neither.

Here, GCD(\ldots) denotes greatest common divisor.

Constraints

2 \leq N \leq 10^6

1 \leq A_i\leq 10^6

Input

Input is given from Standard Input in the following format:

N
A_1 \ldots A_N

Output

If \{A_i\} is pairwise coprime, print pairwise coprime; if \{A_i\} is setwise coprime, print setwise coprime; if neither, print not coprime.

Sample Input 1

3
3 4 5

Sample Output 1

pairwise coprime

GCD(3,4)=GCD(3,5)=GCD(4,5)=1, so they are pairwise coprime.

Sample Input 2

3
6 10 15

Sample Output 2

setwise coprime

Since GCD(6,10)=2, they are not pairwise coprime. However, since GCD(6,10,15)=1, they are setwise coprime.

Sample Input 3

3
6 10 16

Sample Output 3

not coprime

GCD(6,10,16)=2, so they are neither pairwise coprime nor setwise coprime.

Solution in Kotlin (1.3.71) (judge verdict: Wrong Answer)

// solution is at the bottom

import kotlin.math.*
import kotlin.system.exitProcess

@JvmField val INPUT = System.`in`
@JvmField val OUTPUT = System.out

const val _BUFFER_SIZE = 1 shl 16
@JvmField val _buffer = ByteArray(_BUFFER_SIZE)
@JvmField var _bufferPt = 0
@JvmField var _bytesRead = 0

tailrec fun readChar(): Char {
    if(_bufferPt == _bytesRead) {
        _bufferPt = 0
        _bytesRead = INPUT.read(_buffer, 0, _BUFFER_SIZE)
    }
    return if(_bytesRead < 0) Char.MIN_VALUE
    else {
        val c = _buffer[_bufferPt++].toChar()
        if (c == '\r') readChar()
        else c
    }
}

fun readLine(): String? {
    var c = readChar()
    return if(c == Char.MIN_VALUE) null
    else buildString {
        while(true) {
            when(c) {
                '\n', Char.MIN_VALUE -> return@buildString
                else -> {
                    append(c)
                    c = readChar()
                }
            }
        }
    }
}
fun readLn() = readLine()!!

fun read() = buildString {
    var c = readChar()
    while(c <= ' ') {
        if(c == Char.MIN_VALUE) return@buildString
        c = readChar()
    }
    do {
        append(c)
        c = readChar()
    } while(c > ' ')
}
fun readInt() = read().toInt()
fun readDouble() = read().toDouble()
fun readLong() = read().toLong()
fun readStrings(n: Int) = List(n) { read() }
fun readLines(n: Int) = List(n) { readLn() }
fun readInts(n: Int) = List(n) { read().toInt() }
fun readIntArray(n: Int) = IntArray(n) { read().toInt() }
fun readDoubles(n: Int) = List(n) { read().toDouble() }
fun readDoubleArray(n: Int) = DoubleArray(n) { read().toDouble() }
fun readLongs(n: Int) = List(n) { read().toLong() }
fun readLongArray(n: Int) = LongArray(n) { read().toLong() }

fun gcd(xx: Int, yy: Int): Int {
    var x = xx
    var y = yy
    while (y != 0) {
        x %= y
        x = y.also {y = x}
    }

    return x
}

fun main() {
    val MAX = 1_000_001
    val n = readInt()
    val a = readIntArray(n)

    val primes = BooleanArray(MAX) {true}
    primes[2] = true
    primes[1] = false
    for (p in 2 until MAX) {
        if (primes[p]) {
            var pp = 2*p
            while (pp < MAX) {
                primes[pp] = false
                pp += p
            }
        }
    }

    val primesSet = mutableSetOf<Int>()
    val primesList = mutableListOf<Int>()
    val used = BooleanArray(MAX) {false}

    for (x in 1..MAX - 1) {
        if (primes[x]) {
            primesSet.add(x)
            primesList.add(x)
        }
    }

    var ok = false

    fun factorize(x: Int) {
        if (x == 1) {
            return
        }
        if (x in primesSet) {
            if (used[x]) {
                ok = true
                return
            } else {
                used[x] = true
            }
        } else {
            for (p in primesList) {
                if (x % p == 0) {
                    if (used[p]) {
                        ok = true
                        return
                    } else {
                        used[p] = true
                        var xx = x
                        while (xx % p == 0) {
                            xx /= p
                        }

                        factorize(xx)
                        break
                    }
                }
            }
        }
    }

    if (n < primesSet.size) {
        for (i in 0 until n) {
            factorize(a[i])
            if (ok) {
                break
            }
        }

        if (!ok) {
            println("pairwise coprime")
            exitProcess(0)
        }
    }

    var g = a[0]
    for (i in 1 until n) {
        g = gcd(g, a[i])
    }

    if (g == 1) {
        println("setwise coprime")
    } else {
        println("not coprime")
    }


}