Cod sursa(job #2240967)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 14 septembrie 2018 15:56:47
Problema Light2 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>
#define ll long long

using namespace std;

const ll INF = 1e18;
const int MAXK = 22;

inline ll gcd(ll a, ll b) {
    ll r;
    while(b > 0) {
        r = a % b;
        a = b;
        b = r;
    }
    return a;
}

int d[MAXK];
ll fr[MAXK + 2];

int main() {
    FILE *fi, *fout;
    int i, k;
    ll n;
    fi = fopen("light2.in" ,"r");
    fout = fopen("light2.out" ,"w");
    fscanf(fi,"%lld %d " ,&n,&k);
    for(i = 0; i < k; i++) {
        fscanf(fi,"%d " ,&d[i]);
    }
    for(int conf = 1; conf < (1 << k); conf++) {
        ll prd = 1;
        int cnt = 0;
        bool bad = 0;
        for(i = 0; i < k; i++) {
            if(conf & (1 << i)) {
                cnt++;
                prd /= gcd(prd, d[i]);
                if(INF / prd < d[i]) {
                    bad = 1;
                    break;
                }
                prd *= d[i];
            }
        }
        if(!bad) {
            for(i = cnt; i >= 1; i--) {
                if((cnt - i) & 1) {
                    fr[i] -= n / prd;
                }
                else {
                    fr[i] += n / prd;
                }
            }
        }
    }
    ll ans = 0;
    for(i = 1; i <= k; i += 2) {
        ans += fr[i] - fr[i + 1];
    }
    fprintf(fout,"%lld" ,ans);
    fclose(fi);
    fclose(fout);
    return 0;
}