Cod sursa(job #541517)

Utilizator DraStiKDragos Oprica DraStiK Data 25 februarie 2011 11:53:58
Problema Lazy Scor 0
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 1 Marime 1.09 kb
#include <algorithm>
using namespace std;

#define DIM 25

long long N,nrt;
int d[DIM];
int K,M;

void read ()
{
    int i;
    scanf ("%lld%d",&N,&K);
    for (i=1; i<=K; ++i)
        scanf ("%d",&d[i]);
}

inline int cmmdc (int a,int b)
{
    if (!b)
        return a;
    return cmmdc (b,a%b);
}

void solve ()
{
    int stare,i,j,nrb;
    long long nrc;

    sort (d+1,d+K+1);
    for (i=1; i<K; ++i)
        if (d[i]==d[i+1])
        {
            for (j=i+2; j<=K; ++j)
                d[j-2]=d[j];
            K-=2;
        }

    for (stare=1; stare<(1<<K); ++stare)
    {
        nrb=0; nrc=1;
        for (i=1; i<=K; ++i)
            if (stare&(1<<(i-1)))
            {
                ++nrb;
                nrc=nrc*d[i]/cmmdc (d[i],nrc%d[i]);
            }
        if (nrb&1)
            nrt+=(N/nrc)*(1<<(nrb-1));
        else
            nrt-=(N/nrc)*(1<<(nrb-1));
    }
    printf ("%lld",nrt);
}

int main ()
{
    freopen ("light2.in","r",stdin);
    freopen ("light2.out","w",stdout);

    read ();
    solve ();

    return 0;
}