Cod sursa(job #2181419)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 21 martie 2018 17:41:38
Problema Light2 Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <cstdio>
#include <algorithm>

using namespace std;
int v[30],p[30];
long long cmmdc (long long a,long long b){
    int r;
    while (b){
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}
int main()
{
    FILE *fin=fopen ("light2.in","r");
    FILE *fout=fopen ("light2.out","w");
    int n,k,poz,lc,i,fact;
    long long sol,nr;
    fscanf (fin,"%d%d",&n,&k);
    for (i=1;i<=k;i++)
        fscanf (fin,"%d",&v[i]);
    sort (v+1,v+k+1);
    poz=0;
    lc=1;
    for (i=1;i<=k;i++){
        if (v[i]!=v[i+1]){
            if (lc%2==1)
                v[++poz]=v[i];
            lc=1;
        }
        else lc++;
    }
    k=poz;
    sol=0;
    // facem un fel de pinex
    while (v[0]==0){
        i=k;
        while (p[i]){
            p[i]--;
            i--;
        }
        p[i]=1;
        if (i==0)
            break;
        nr=1;
        fact=0;
        for (i=1;i<=k;i++){
            if (p[i]){
                nr=nr*v[i]/cmmdc(nr,v[i]);
                fact++;
            }
            if (nr>n)
                break;
        }
        if (i<=k)
            continue;
        if (fact%2==1)
            sol=sol+(1<<(fact-1))*n/nr;
        else sol=sol-(1<<(fact-1))*n/nr; // i am adunat de mai mult de n/nr ori
        // i am adunat la fiecare factor la care am fost + sumele cu factori impari
    }
    fprintf (fout,"%lld",sol);
    return 0;
}