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: Time Limit Exceeded)


import java.math.BigInteger


const val A = "pairwise coprime"
const val B = "setwise coprime"
const val C = "not coprime"
fun main(args: Array<String>) {
    val n = getInt()
    val a = getInts()

    val g = a.reduce(::gcd)
    if (g != 1) {
        println(C)
        return
    }

    var x = BigInteger(a.first().toString())
    a.drop(1).map { BigInteger(it.toString()) }.forEach { y ->
        if (gcd(x, y) != BigInteger.ONE) {
            println(B)
            return
        }

        x = lcm(x, y)
    }

    println(A)
}

fun gcd(a: Int, b: Int): Int {
    if (a % b == 0) return b
    else return gcd(b, a % b)
}

fun gcd(a: BigInteger, b: BigInteger): BigInteger {
    if (a.mod(b) == BigInteger.ZERO) return b
    else return gcd(b, a % b)
}

fun lcm(a: BigInteger, b: BigInteger): BigInteger {
    return a * b / gcd(a, b)
}

fun getInt() = readLine()!!.toInt()
fun getInts() = readLine()!!.split(" ").map { it.toInt() }
fun getLong() = readLine()!!.toLong()
fun getLongs() = readLine()!!.split(" ").map { it.toLong() }