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


#include <bits/stdc++.h>
using namespace std;
#define inf INT_MAX
#define INF LLONG_MAX
#define ll long long
#define ull unsigned long long
#define M (int)(1e9 + 7)
#define P pair<int, int>
#define FOR(i, m, n) for (int i = (int)m; i < (int)n; i++)
#define RFOR(i, m, n) for (int i = (int)m; i >= (int)n; i--)
#define rep(i, n) FOR(i, 0, n)
#define rrep(i, n) RFOR(i, n, 0)
#define all(a) a.begin(), a.end()
const int vx[4] = {0, 1, 0, -1};
const int vy[4] = {1, 0, -1, 0};
#define F first
#define S second
#define PB push_back
#define EB emplace_back
#define int ll
#define vi vector<int>
#define IP pair<int, P>
#define PI pair<P, int>
#define PP pair<P, P>
#define Yes(f)                                                                 \\
  { cout << (f ? "Yes" : "No") << endl; }
#define YES(f)                                                                 \\
  { cout << (f ? "YES" : "NO") << endl; }

vector<int> divisor(int n) {
  vector<int> ret;
  for (int i = 1; i * i <= n; i++) {
    if (n % i == 0) {
      ret.PB(i);
      if (i * i != n)
        ret.PB(n / i);
    }
  }

  sort(all(ret));

  return ret;
}

signed main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(20);

  int n;
  cin >> n;

  /*
  FOR(k,2,n+1){
      int m=n;
      while(m>1){
          if(m%k==0) m=m/k;
          else m=m-k;
          //cout<<m<<endl;
      }
      if(m==1){
          cout<<k<<endl;
      }
  }
  */

  set<int> st;
  st.insert(2);
  if (n % 3 == 1)
    st.insert(3);
  st.insert(n);
  if (n > 2)
    st.insert(n - 1);

  vi d = divisor(n - 1);
  for (int i : d) {
    if (i > 1)
      st.insert(i);
  }

  FOR(i, 2, n) {
    if (i * i > n)
      break;
    int m = n;
    while (m % i == 0)
      m /= i;
    if (m == 1)
      st.insert(i);
  }

  // cout<<st.size()<<endl;
  // for(int i:st)cout<<i<<endl;

  vi di = divisor(n);
  for (int i : di) {
    if (i == 1)
      continue;
    int m = n;
    while (m % i == 0)
      m /= i;
    if (m % i == 1)
      st.insert(i);
  }

  cout << st.size() << endl;
}

Error: TLE

Fixed submission:



#include <bits/stdc++.h>
using namespace std;
#define inf INT_MAX
#define INF LLONG_MAX
#define ll long long
#define ull unsigned long long
#define M (int)(1e9 + 7)
#define P pair<int, int>
#define FOR(i, m, n) for (int i = (int)m; i < (int)n; i++)
#define RFOR(i, m, n) for (int i = (int)m; i >= (int)n; i--)
#define rep(i, n) FOR(i, 0, n)
#define rrep(i, n) RFOR(i, n, 0)
#define all(a) a.begin(), a.end()
const int vx[4] = {0, 1, 0, -1};
const int vy[4] = {1, 0, -1, 0};
#define F first
#define S second
#define PB push_back
#define EB emplace_back
#define int ll
#define vi vector<int>
#define IP pair<int, P>
#define PI pair<P, int>
#define PP pair<P, P>
#define Yes(f)                                                                 \\
  { cout << (f ? "Yes" : "No") << endl; }
#define YES(f)                                                                 \\
  { cout << (f ? "YES" : "NO") << endl; }

vector<int> divisor(int n) {
  vector<int> ret;
  for (int i = 1; i * i <= n; i++) {
    if (n % i == 0) {
      ret.PB(i);
      if (i * i != n)
        ret.PB(n / i);
    }
  }

  sort(all(ret));

  return ret;
}

signed main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(20);

  int n;
  cin >> n;

  /*

  FOR(k,2,n+1){
      int m=n;
      while(m>1){
          if(m%k==0) m=m/k;
          else m=m-k;
          //cout<<m<<endl;
      }
      if(m==1){
          cout<<k<<endl;
      }
  }

  */

  set<int> st;
  st.insert(2);
  st.insert(n);
  if (n > 2)
    st.insert(n - 1);

  int m = n;
  int k = 3;
  while (m > 1) {
    if (m % k == 0)
      m = m / k;
    else
      m = m - k;
    // cout<<m<<endl;
  }
  if (m == 1) {
    st.insert(k);
  }

  vi d = divisor(n - 1);
  for (int i : d) {
    if (i > 1)
      st.insert(i);
  }

  FOR(i, 2, n) {
    if (i * i > n)
      break;
    int m = n;
    while (m % i == 0)
      m /= i;
    if (m == 1)
      st.insert(i);
  }

  cout << st.size() << endl;
  // for(int i:st)cout<<i<<endl;
}