Problem p02574 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <bitset>
#include <iomanip>
#include <iostream>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
typedef long long int ll;
typedef pair<int, ll> P;

//--------------
/// #define DEBUG
//--------------

#ifdef DEBUG
#define debugprint(x) cout << x << " "
#define debugendl cout << endl
#define debug(x) x
#else
#define debugprint(x)
#define debugendl
#define debug(x)
#endif

class zahyo {
public:
  int x;
  int y;
  zahyo() {
    x = 0;
    y = 0;
  }
  zahyo(int x_, int y_) {
    x = x_;
    y = y_;
  }
  void print() { cout << x << " " << y; }
  zahyo operator+(zahyo add) {
    add.x = this->x + add.x;
    add.y = this->y + add.y;
    return add;
  }
  zahyo operator-(zahyo add) {
    add.x = this->x - add.x;
    add.y = this->y - add.y;
    return add;
  }
  zahyo operator*(int t) {
    zahyo temp;
    temp.x = this->x * t;
    temp.y = this->y * t;
    return temp;
  }
  zahyo operator%(int t) {
    zahyo temp(this->x % t, this->y % t);
    return temp;
  }
  zahyo operator/(int t) {
    zahyo temp(this->x / t, this->y / t);
    return temp;
  }
  bool operator==(const zahyo add) const {
    if (add.x == this->x and add.y == this->y) {
      return true;
    } else {
      return false;
    }
  }
  bool operator!=(const zahyo add) const {
    if (add.x == this->x or add.y == this->y) {
      return false;
    } else {
      return true;
    }
  }
  bool operator<(const zahyo add) const {
    if (this->x < add.x) {
      return true;
    } else if (this->x == add.x and this->y < add.y) {
      return true;
    } else {
      return false;
    }
  }
  bool operator>(const zahyo add) const {
    if (this->x > add.x) {
      return true;
    } else if (this->x == add.x and this->y > add.y) {
      return true;
    } else {
      return false;
    }
  }
  void input() { cin >> x >> y; }
};
int p[168] = {2,   3,   5,   7,   11,  13,  17,  19,  23,  29,  31,  37,  41,
              43,  47,  53,  59,  61,  67,  71,  73,  79,  83,  89,  97,  101,
              103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167,
              173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239,
              241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313,
              317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397,
              401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467,
              479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569,
              571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643,
              647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733,
              739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823,
              827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911,
              919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997};
int a[1000000];
int main() {
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  bool ispairwise = true;
  bool issetwise = true;
  for (int i = 0; i < 168; i++) {
    bool morethanone = false;
    bool none = false;
    for (int j = 0; j < n; j++) {
      if (a[j] % p[i] != 0) {
        none = true;
      } else {
        if (morethanone) {
          ispairwise = false;
        }
        morethanone = true;
        a[j] = a[j] / p[i];
      }
    }
    if (morethanone == true and none == false) {
      issetwise = false;
    }
  }
  /*int remain=-1;
  for(int i=0;i<n;i++){
          if(a[i]!=1){
                  remain=a[i];
                  bool morethanone=false;
                  bool none=false;
                          for(int j=i;j<n;j++){
                                  if(i!=0){none=true;}
                                   if(a[j]!=remain){
                                           none=true;
                                   }
                                   else{
                                           if(morethanone){
                                                   ispairwise=false;
                                           }
                                           morethanone=true;
                                           a[j]=1;
                                   }
                  }
                   if(morethanone==true and none==false){
                           issetwise=false;
                   }
          }
  }*/
  sort(a, a + n);
  if (a[0] == a[n - 1] and a[0] != 1) {
    issetwise = false;
    ispairwise = false;
  }
  for (int i = 0; i < n - 1; i++) {
    if (a[i] == a[i + 1] and a[i] != 1) {
      ispairwise = false;
    }
  }

  if (ispairwise) {
    cout << "pairwise coprime" << endl;
  } else if (issetwise) {
    cout << "setwise coprime" << endl;
  } else {
    cout << "not coprime" << endl;
  }
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <bitset>
#include <iomanip>
#include <iostream>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
typedef long long int ll;
typedef pair<int, ll> P;

//--------------
/// #define DEBUG
//--------------

#ifdef DEBUG
#define debugprint(x) cout << x << " "
#define debugendl cout << endl
#define debug(x) x
#else
#define debugprint(x)
#define debugendl
#define debug(x)
#endif

class zahyo {
public:
  int x;
  int y;
  zahyo() {
    x = 0;
    y = 0;
  }
  zahyo(int x_, int y_) {
    x = x_;
    y = y_;
  }
  void print() { cout << x << " " << y; }
  zahyo operator+(zahyo add) {
    add.x = this->x + add.x;
    add.y = this->y + add.y;
    return add;
  }
  zahyo operator-(zahyo add) {
    add.x = this->x - add.x;
    add.y = this->y - add.y;
    return add;
  }
  zahyo operator*(int t) {
    zahyo temp;
    temp.x = this->x * t;
    temp.y = this->y * t;
    return temp;
  }
  zahyo operator%(int t) {
    zahyo temp(this->x % t, this->y % t);
    return temp;
  }
  zahyo operator/(int t) {
    zahyo temp(this->x / t, this->y / t);
    return temp;
  }
  bool operator==(const zahyo add) const {
    if (add.x == this->x and add.y == this->y) {
      return true;
    } else {
      return false;
    }
  }
  bool operator!=(const zahyo add) const {
    if (add.x == this->x or add.y == this->y) {
      return false;
    } else {
      return true;
    }
  }
  bool operator<(const zahyo add) const {
    if (this->x < add.x) {
      return true;
    } else if (this->x == add.x and this->y < add.y) {
      return true;
    } else {
      return false;
    }
  }
  bool operator>(const zahyo add) const {
    if (this->x > add.x) {
      return true;
    } else if (this->x == add.x and this->y > add.y) {
      return true;
    } else {
      return false;
    }
  }
  void input() { cin >> x >> y; }
};
int p[168] = {2,   3,   5,   7,   11,  13,  17,  19,  23,  29,  31,  37,  41,
              43,  47,  53,  59,  61,  67,  71,  73,  79,  83,  89,  97,  101,
              103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167,
              173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239,
              241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313,
              317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397,
              401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467,
              479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569,
              571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643,
              647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733,
              739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823,
              827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911,
              919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997};
int a[1000000];
int main() {
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  bool ispairwise = true;
  bool issetwise = true;
  for (int i = 0; i < 168; i++) {
    bool morethanone = false;
    bool none = false;
    for (int j = 0; j < n; j++) {
      if (a[j] % p[i] != 0) {
        none = true;
      } else {
        if (morethanone) {
          ispairwise = false;
        }
        morethanone = true;
        a[j] = a[j] / p[i];
      }
    }
    if (morethanone == true and none == false) {
      issetwise = false;
    }
  }
  int remain = -1;
  for (int i = 0; i < n; i++) {
    if (a[i] != 1) {
      remain = a[i];
      bool morethanone = false;
      bool none = false;
      for (int j = i; j < n; j++) {
        if (i != 0) {
          none = true;
        }
        if (a[j] != remain) {
          none = true;
        } else {
          if (morethanone) {
            ispairwise = false;
          }
          morethanone = true;
          a[j] = 1;
        }
      }
      if (morethanone == true and none == false) {
        issetwise = false;
      }
    }
  }
  if (ispairwise) {
    cout << "pairwise coprime" << endl;
  } else if (issetwise) {
    cout << "setwise coprime" << endl;
  } else {
    cout << "not coprime" << endl;
  }
}