Cod sursa(job #1773965)

Utilizator akaprosAna Kapros akapros Data 8 octombrie 2016 13:39:40
Problema Light2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <bits/stdc++.h>
#define maxK 23
#define ll long long
#define maxP (1 << 22) + 2
using namespace std;
int m, k, d[maxK], cfmax, lpow[maxP];
ll n, ans;
ll gcd(ll x, ll y)
{
    ll r = x % y;
    while (r)
    {
        x = y;
        y = r;
        r = x % y;
    }
    return y;
}
void read()
{
    freopen("light2.in", "r", stdin);
    scanf("%lld\n", &n);
    scanf("%d", &k);
    for (int i = 0; i < k; ++ i)
    {
        scanf("%d", &d[i]);
        lpow[1 << i] = i;
    }
}
void pinex(int i, int nb, ll lcm)
{
    int j;
    for (j = i + 1; j < k; ++ j)
    {
        ll Lcm = 1LL * (1LL * lcm * d[j]) / gcd(lcm, 1LL * d[j]);
        if (Lcm <= n)
        {
            if (nb & 1)
            ans -= 1LL * (n / Lcm) << nb;
            else
            ans += 1LL * (n / Lcm) << nb;
            pinex(j, nb + 1, Lcm);
        }
    }
}
void solve()
{
    int i, j;
    cfmax = 1 << k;
    pinex(-1, 0, 1);
}
void write()
{
    freopen("light2.out", "w", stdout);
    printf("%lld\n", ans);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}