Cod sursa(job #540555)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 24 februarie 2011 01:16:31
Problema Light2 Scor Ascuns
Compilator cpp Status done
Runda Marime 0.99 kb
#include <cstdio>

#define FOR(i, s, d) for(i= (s); i < (d); ++i)

int k, A[32], C[32][32], H[32];
long long n, sol;

int gcd(long long a, int b)
{
  while(a && b)
    if(a >= b)
      a %= b;
    else
      b %= a;
  return a | b;
}

void doit(int i, int nr, long long p)
{
  if(p > n)
    return;
  if(i == k)
  {
    int j;
    if(nr & 1)
      FOR(j, nr % 2, i + 1)
        sol += n / p * C[nr][j], j++;
    else
      FOR(j, nr % 2, i + 1)
        sol -= n / p * C[nr][j], j++;
    return ;
  }
  doit(i + 1, nr, p);
  doit(i + 1, nr + 1, p / gcd(p, A[i]) * A[i]);
}

int main()
{
  int i, j;
  freopen("light2.in", "r", stdin);
  freopen("light2.out", "w", stdout);
  scanf("%lld", &n);
  scanf("%d", &k);
  FOR(i, 0, k)
    scanf("%d", &A[i]);
  C[0][0] = 1;
  FOR(i, 1, k + 1)
  {
    C[i][0] = C[i][i] = 1;
    FOR(j, 1, i)
      C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
  }
  FOR(i, 1, k + 1)
    FOR(j, i % 2, i + 1)
      H[i] += C[i][j], ++j;
  doit(0, 0, 1);
  printf("%lld\n", sol);
  return 0;
}