Cod sursa(job #2181482)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 21 martie 2018 18:15:16
Problema Light2 Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>
#include <algorithm>

using namespace std;
long long v[30],sol,n;
int p[30],k;
long long cmmdc (long long a,long long b){
    long long r;
    while (b){
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}
void back (int pas,int i,long long x){
    if (x>n)
        return;
    // updatez sol ul
    //if (x==2)
    //printf ("%d ",x);
    if (pas!=1){
        if (pas%2==0) // sunt de fapt in cazul pas%2==1
            sol=sol+(1<<(pas-2))*n/x;
        else sol=sol-(1<<(pas-2))*n/x;
    }
    if (pas==k+1)
        return;
    for (int j=i+1;j<=k;j++){
        back (pas+1,j,x*v[j]/cmmdc(x,v[j]));
    }
}
int main()
{
    FILE *fin=fopen ("light2.in","r");
    FILE *fout=fopen ("light2.out","w");
    int i,poz,lc;
    fscanf (fin,"%lld%d",&n,&k);
    for (i=1;i<=k;i++)
        fscanf (fin,"%lld",&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;
    // facem un fel de pinex
    back (1,0,1); // back recursiv
    fprintf (fout,"%lld",sol);
    return 0;
}