Cod sursa(job #2246729)

Utilizator ApostolIlieDanielApostol Daniel ApostolIlieDaniel Data 27 septembrie 2018 14:33:08
Problema Light2 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <bits/stdc++.h>

using namespace std;

FILE *fin = fopen ("light2.in", "r"), *fout = fopen ("light2.out", "w");
const int MAXK = 22;
int k;
long long n, sol;
int a[MAXK + 1], d[MAXK + 1];

inline long long cmmdc (long long a, long long b) {
  while (b > 0) {
    long long r = a % b;
    a = b;
    b = r;
  }
  return a;
}

inline void back (int poz, long long cmmmc, int level) {
  if (poz > k) {
    if (level == 0)
      return;
    //fprintf (fout, "%lld\n", cmmmc);
    if (level % 2)
      sol = sol + n / cmmmc * (1 << (level - 1));
    else
      sol = sol - n / cmmmc * (1 << (level - 1));
  }
  else {
    a[poz] = 0;
    back (poz + 1, cmmmc, level);
    a[poz] = 1;
    if (cmmmc * d[poz] / cmmdc (cmmmc, d[poz]) <= n)
      back (poz + 1, cmmmc * d[poz] / cmmdc (cmmmc, d[poz]), level + 1);
  }
}

int main() {
  fscanf (fin, "%lld%d", &n, &k);
  for (int i = 1; i <= k; i++)
    fscanf (fin, "%d", &d[i]);
  sol = 0;
  back (1, 1, 0);
  fprintf (fout, "%lld", sol);
  fclose (fin);
  fclose (fout);
  return 0;
}