Cod sursa(job #2193037)

Utilizator cella.florescuCella Florescu cella.florescu Data 8 aprilie 2018 14:34:29
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <bits/stdc++.h>

using namespace std;

typedef long long lld;

vector < lld > fact;

inline lld coprimes(lld lim) {
  lld ans = lim;
  for (int conf = 1; conf < (1 << (int) fact.size()); ++conf) {
    lld sgn = 1, cmmmc = 1;
    for (int b = 0; b < (int) fact.size(); ++b)
      if (conf & (1 << b)) {
        sgn = -sgn;
        cmmmc *= fact[b];
      }
    ans += lim / cmmmc * sgn;
  }
  return ans;
}

int main()
{
    lld n, p, ans = 0;
    ifstream fin("frac.in");
    fin >> n >> p;
    fin.close();
    for (lld d = 2; d * d <= n; ++d)
      if (n % d == 0) {
        fact.push_back(d);
        while (n % d == 0)
          n /= d;
      }
    if (n > 1)
      fact.push_back(n);
    for (lld step = 1LL << 61; step > 0; step >>= 1)
      if (coprimes(ans + step) < p)
        ans += step;
    ofstream fout("frac.out");
    fout << ans + 1 << '\n';
    fout.close();
    return 0;
}