Problem p02900 (C++)

Buggy submission (status: Time Limit Exceeded):

#include <algorithm>
#include <chrono>
#include <deque>
#include <fstream>
#include <functional>
#include <iostream>
#include <iterator>
#include <limits>
#include <map>
#include <math.h>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

#define forr(i, start, count) for (int i = (start); i < (start) + (count); ++i)
#define set_map_includes(set, elt) (set.find((elt)) != set.end())
#define readint(i)                                                             \
  int i;                                                                       \
  cin >> i
#define readll(i)                                                              \
  ll i;                                                                        \
  cin >> i
#define readdouble(i)                                                          \
  double i;                                                                    \
  cin >> i
#define readstring(s)                                                          \
  string s;                                                                    \
  cin >> s

typedef long long ll;

using namespace std;

ll modd = 1000 * 1000 * 1000 + 7;

ll binary_search(function<bool(ll)> func, ll start, ll end) {
  /*      func:int ->bool
          returns smallest int x where func(x) evaluates to true, searches in
     [start,end), it is assumed the values are false, .. , false, true ...
           */
  if (end <= start) {
    return end;
  } // has to be here, otherwise func(end-1) in next line could be a problem
  if (!func(end - 1)) {
    return end;
  }
  while (end - start > 1) {
    ll mid = (start + end) / 2;
    if (func(mid)) {
      end = mid;
    } else {
      start = mid;
    }
  }
  if (func(start)) {
    return start;
  } else {
    return end;
  }
};

long long gcd(long long a, long long b) {
  if (a == 0) {
    return b;
  }
  return gcd(b % a, a);
};

int main() {

  ios_base::sync_with_stdio(false);

  cout.precision(17);
  mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  uniform_int_distribution<int> rand_gen(
      0, modd); // rand_gen(rng) gets the rand no

  //    auto start = chrono::steady_clock::now();

  //    readint(test_cases);
  int test_cases = 1;
  forr(t, 1, test_cases) {
    readll(n);
    readll(m);
    n = gcd(n, m);

    int d = 2;
    set<int> primes;
    primes.insert(1);
    while (d * d <= n) {
      if (n % d == 0) {
        n /= d;
        primes.insert(d);
      } else {
        d++;
      }
    }
    primes.insert(n);

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

  //    auto end = chrono::steady_clock::now();
  //    cout << chrono::duration_cast<chrono::milliseconds>(end - start).count()
  //    << endl;

  return 0;
}

Fixed submission:

#include <algorithm>
#include <chrono>
#include <deque>
#include <fstream>
#include <functional>
#include <iostream>
#include <iterator>
#include <limits>
#include <map>
#include <math.h>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

#define forr(i, start, count) for (int i = (start); i < (start) + (count); ++i)
#define set_map_includes(set, elt) (set.find((elt)) != set.end())
#define readint(i)                                                             \
  int i;                                                                       \
  cin >> i
#define readll(i)                                                              \
  ll i;                                                                        \
  cin >> i
#define readdouble(i)                                                          \
  double i;                                                                    \
  cin >> i
#define readstring(s)                                                          \
  string s;                                                                    \
  cin >> s

typedef long long ll;

using namespace std;

ll modd = 1000 * 1000 * 1000 + 7;

ll binary_search(function<bool(ll)> func, ll start, ll end) {
  /*      func:int ->bool
          returns smallest int x where func(x) evaluates to true, searches in
     [start,end), it is assumed the values are false, .. , false, true ...
           */
  if (end <= start) {
    return end;
  } // has to be here, otherwise func(end-1) in next line could be a problem
  if (!func(end - 1)) {
    return end;
  }
  while (end - start > 1) {
    ll mid = (start + end) / 2;
    if (func(mid)) {
      end = mid;
    } else {
      start = mid;
    }
  }
  if (func(start)) {
    return start;
  } else {
    return end;
  }
};

long long gcd(long long a, long long b) {
  if (a == 0) {
    return b;
  }
  return gcd(b % a, a);
};

int main() {

  ios_base::sync_with_stdio(false);

  cout.precision(17);
  mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  uniform_int_distribution<int> rand_gen(
      0, modd); // rand_gen(rng) gets the rand no

  //    auto start = chrono::steady_clock::now();

  //    readint(test_cases);
  int test_cases = 1;
  forr(t, 1, test_cases) {
    readll(n);
    readll(m);
    n = gcd(n, m);

    ll d = 2;
    set<ll> primes;
    primes.insert(1);
    while (d * d <= n) {
      if (n % d == 0) {
        n /= d;
        primes.insert(d);
      } else {
        d++;
      }
    }
    primes.insert(n);

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

  //    auto end = chrono::steady_clock::now();
  //    cout << chrono::duration_cast<chrono::milliseconds>(end - start).count()
  //    << endl;

  return 0;
}