Cod sursa(job #682659)

Utilizator VmanDuta Vlad Vman Data 19 februarie 2012 12:47:06
Problema Light2 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <cstdio>

char p[1<<22];
int K, nr, i, j;
long long N, D[22], sol, t[1<<22];

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

int main()
{
    freopen("light2.in","r",stdin);
    freopen("light2.out","w",stdout);
    
    scanf("%lld", &N);
    scanf("%d", &K);
    for (i=0; i<K; ++i)
        scanf("%d", &D[i]);
    
    nr = 1<<K;
    t[0] = 1;
    p[0] = 0;
    for (i=1; i<nr; ++i)
    {
        for (j=0; j<K; ++j)
            if (i & (1<<j))
            {
               t[i] = t[i-(1<<j)] * D[j] / cmmdc(t[i-(1<<j)], D[j]), p[i] = p[i-(1<<j)]+1;
               break;
            }
        if (p[i] & 1) sol += N / t[i] * (1<<(p[i]-1));
           else sol -= N/t[i]*(1<<(p[i]-1));      
    }
    
    printf("%lld\n", sol);
    
    return 0;
}