Cod sursa(job #595839)

Utilizator S7012MYPetru Trimbitas S7012MY Data 14 iunie 2011 16:25:10
Problema Light2 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <iostream>
#include <fstream>
#define LL long long
using namespace std;

LL n,k,r,d[25];

static inline LL gcd(LL u, LL v){
    if(u == v)
        return v;
    if(0==u)
        return v;
    if(0==v)
        return u;
    if(0==(u&1)){
        if(0==(v&1))
            return (gcd((u>>1), (v>>1))<<1);
        else
            return  gcd(u>>1, v);
    }
    else if(0==(v&1))
        return gcd(u, (v>>1));
    else{
        if(u>=v)
            return gcd(((u-v)>>1), v);
        else
            return gcd(((v-u)>>1), u);
    }
}

inline LL cmmmc(LL a, LL b) {
    return (a*b)/(gcd(a,b));
}

void back(int p, int nr,LL pas) {
    if(p==k+1 || pas>n) return;
    LL cm=cmmmc(pas,d[p]);
    if(nr&1) r+=((n/cm)*(1<<(nr-1)));
    else r-=((n/cm)*(1<<(nr-1)));
    back(p+1,nr,pas);
    back(p+1,nr+1,cm);
}

int main()
{
    ifstream f("light2.in");
    ofstream g("light2.out");
    f>>n>>k;
    for(int i=1; i<=k; ++i) f>>d[i];
    back(1,1,1);
    g<<r;
    return 0;
}