Cod sursa(job #1246870)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 21 octombrie 2014 19:08:38
Problema Light2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
using namespace std;
#include <fstream>
ifstream fin("light2.in");
ofstream fout("light2.out");
#define ll long long
#define Kmax 22

int k;
ll n, s = 0;
int v[Kmax];

ll cmmdc(ll, ll) ;
void numara(int, int, int, ll) ;

int main()
{
    int i;
    fin >> n >> k;
    for(i = 0; i < k; ++i) fin >> v[i];

    numara(0, 0, 0, 1);

    fout << s << '\n';
    return 0;
}


ll cmmmc(ll a, ll b)
{
    if(a == 1) return b;
    if(b == 1) return a;
    if(a == n + 1) return n + 1;
    if(b == n + 1) return n + 1;

    ll r, a1 = a, b1 = b;
    while(a % b != 0)
    {
        r = a % b;
        a = b;
        b = r;
    }

    r = (a1 / b) * b1;
    if(r > n) r = 1 + n;
    return r;
}


void numara(int stare, int level, int nr, ll mult)
{
    if(nr > 0 && stare == 1 && mult <= n)
    {
        if((nr & 1) == 1) s += (n / mult) * (1 << (nr - 1));
        else s -= (n / mult) * (1 << (nr - 1));
    }

    if(level == k) return;
    numara(0, level + 1, nr, mult);

    numara(1, level + 1, nr + 1, cmmmc(mult, v[level]));
}