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 C# (.NET Core 3.1.201) (judge verdict: Time Limit Exceeded)

using System.Linq;
using System.Text;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.Runtime.CompilerServices;
using System.IO.Pipes;

namespace AtCoder
{
    class Program
    {

        struct Point
        {
            public int x;
            public int y;

            public Point(int x, int y)
            {

                this.x = x;
                this.y = y;

            }

        }


        const int BiggestMod = 1000000007;

        public static void Main()
        {

            /*

            int num = int.Parse(Console.ReadLine());
            long ans = 0;

            long[] args = Console.ReadLine().Split(' ').Select(x => long.Parse(x)).ToArray();

            long[] data = new long[num - 1];

            data[num - 2] = args[num - 1];

            for (int i = num - 2; 0 < i; --i)
                data[i - 1] = args[i] + data[i];

            for (int i = 0; i < num - 1; ++i)
            {

                ans += args[i] * data[i];
                ans %= BiggestMod;

            }

            Console.WriteLine(ans);
            
             */

            int num = int.Parse(Console.ReadLine());

            int GetGcd(int a, int b)
                => Gcd(Math.Max(a, b), Math.Min(a, b));

            int Gcd(int a, int b)
                => (a % b == 0 ? b : Gcd(b, a % b));

            var args = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();
            var buf = args[0];

            for (int i = 1; i < num; ++i)
            {

                buf = GetGcd(buf, args[i]);
                if (buf == 1)
                {
                    goto skip;
                }

            }

            Console.WriteLine("not coprime");
            return;

        skip:

            Array.Sort(args);

            for (int i = 0; i + 1< num; ++i)
                for (int j = i + 1; j < num; ++j)
                    if (Gcd(args[j], args[i]) != 1)
                    {

                        Console.WriteLine("setwise coprime");
                        return;

                    }

            Console.WriteLine("pairwise coprime");
            return; 
        }

    }

}